如何實現單向WCF操作?如何在WCF中實現IsOneWay = true nettcpBinding
[OperationContract(IsOneWay=true)]
void MethodName(string param1, int param2)
是否有任何其他的變化,我需要作出或app.config中的任何具體變化:
我只是用IsOneWay屬性作爲試過嗎?
僅供參考,我的WCF服務實現netTcpBinding,但我認爲這不應該有任何區別。
如何實現單向WCF操作?如何在WCF中實現IsOneWay = true nettcpBinding
[OperationContract(IsOneWay=true)]
void MethodName(string param1, int param2)
是否有任何其他的變化,我需要作出或app.config中的任何具體變化:
我只是用IsOneWay屬性作爲試過嗎?
僅供參考,我的WCF服務實現netTcpBinding,但我認爲這不應該有任何區別。
如圖所示,您的代碼看起來不錯。使用netTcpBinding進行單向呼叫應該沒有問題。
如果你有興趣,Juval Lowy真棒Programming WCF Services 2nd Edition中的第5章包含了一些有關單向服務的信息。
從你所顯示的,到目前爲止,雖然我沒有看到任何錯誤。請給我們更多的細節。
以及關於Juval's在線版本的鏈接。 http://msdn.microsoft.com/en-us/magazine/cc163537.aspx – kenny 2010-02-01 15:32:41
這是真棒肯尼! :)該文章引用WCF 3.0。我想知道是否有任何差異3.5 ... – 2010-02-01 15:42:18
我們遇到了單向調用不能立即使用NetTcpBinding返回的問題。這篇博文發現了這個問題並提供了一個解決方案。
從文章:
問題:客戶端調用代理的WCF服務的單向方法,然後關閉方法不返回,直到呼叫被實際完成或撥打倍出。有沒有想過爲什麼會這樣?
原因:當您在接口上指定「單向」時,由於單向綁定元素不在通道堆棧中,所以基礎通道操作仍然是雙向的。因此,關閉操作被阻止,直到單向操作完成。
這是設計和開發團隊正在努力改變它在.Net框架的未來版本。
...
溶液(解決方法):
層如在下面的代碼顯示在NetTcpBinding的頂部的OneWayBindingElement。這樣,代理關閉調用將立即返回,最終單向調用將返回並忘記時尚。
[ServiceContract]
public interface IService1
{
[OperationContract(IsOneWay = true)]
void SetData(int value);
}
public class Service1 : IService1
{
public void SetData(int value)
{
//Application specific code
}
}
服務主機代碼:
Form1ServiceHost = new ServiceHost(this, new Uri("net.tcp://localhost:8091/WindowsFormApp/Form1/"), new Uri("http://localhost:8090/WindowsFormApp/Form1/"));
Binding binding = new NetTcpBinding();
BindingElementCollection oldBindingElements = binding.CreateBindingElements();
BindingElementCollection bindingElements = new BindingElementCollection();
bindingElements.Add(new OneWayBindingElement());
foreach (BindingElement bindingElement in oldBindingElements)
{
bindingElements.Add(bindingElement);
}
binding = new CustomBinding(bindingElements);
Form1ServiceHost.AddServiceEndpoint("WCFServiceLibrary.IService1", binding, "");
Form1ServiceHost.Open();
客戶端代碼:
Binding binding = new NetTcpBinding();
BindingElementCollection oldBindingElements = binding.CreateBindingElements();
BindingElementCollection bindingElements = new BindingElementCollection();
bindingElements.Add(new OneWayBindingElement());
foreach (BindingElement bindingElement in oldBindingElements)
{
bindingElements.Add(bindingElement);
}
binding = new CustomBinding(bindingElements);
Service1Client client = new Service1Client(binding, new EndpointAddress("net.tcp://localhost:8091/WindowsFormApp/Form1/"));
client.SetData(10);
Console.WriteLine("set data");
Console.WriteLine("Now closing the channel,Before close, current time is {0}", DateTime.Now.ToString() + " " + DateTime.Now.Millisecond.ToString());
client.Close();
Console.WriteLine("Now closing the channel,After close, current time is {0}", DateTime.Now.ToString() + " " + DateTime.Now.Millisecond.ToString());`
你不應該只是給另一個網站的鏈接作爲答案,因爲該網站可能會在未來過時。相反,單擊此答案上的「編輯」鏈接,並在此處包含解決方案的主要部分。請參閱:http://meta.stackexchange.com/q/8259 – 2012-02-12 08:40:15
謝謝,我會這樣做。 – 2012-02-13 14:11:22
你得到一個錯誤?如果是這樣,請更新您的問題。 – 2010-02-01 15:22:49
我沒有收到任何錯誤:-(客戶端應用程序仍然在等待整個過程完成。 – iniki 2010-02-01 15:44:55
這種方法調用什麼?嘗試使用單向WCF組件設置一個簡單的示例應用程序,並查看是否可以使其工作。然後看看是否有助於解決這個問題。 – 2010-02-02 19:43:33