2010-02-01 32 views
1

如何實現單向WCF操作?如何在WCF中實現IsOneWay = true nettcpBinding

[OperationContract(IsOneWay=true)] 
void MethodName(string param1, int param2) 

是否有任何其他的變化,我需要作出或app.config中的任何具體變化:

我只是用IsOneWay屬性作爲試過嗎?

僅供參考,我的WCF服務實現netTcpBinding,但我認爲這不應該有任何區別。

+0

你得到一個錯誤?如果是這樣,請更新您的問題。 – 2010-02-01 15:22:49

+0

我沒有收到任何錯誤:-(客戶端應用程序仍然在等待整個過程完成。 – iniki 2010-02-01 15:44:55

+0

這種方法調用什麼?嘗試使用單向WCF組件設置一個簡單的示例應用程序,並查看是否可以使其工作。然後看看是否有助於解決這個問題。 – 2010-02-02 19:43:33

回答

1

如圖所示,您的代碼看起來不錯。使用netTcpBinding進行單向呼叫應該沒有問題。

如果你有興趣,Juval Lowy真棒Programming WCF Services 2nd Edition中的第5章包含了一些有關單向服務的信息。

從你所顯示的,到目前爲止,雖然我沒有看到任何錯誤。請給我們更多的細節。

+0

以及關於Juval's在線版本的鏈接。 http://msdn.microsoft.com/en-us/magazine/cc163537.aspx – kenny 2010-02-01 15:32:41

+0

這是真棒肯尼! :)該文章引用WCF 3.0。我想知道是否有任何差異3.5 ... – 2010-02-01 15:42:18

1

我們遇到了單向調用不能立即使用NetTcpBinding返回的問題。這篇博文發現了這個問題並提供了一個解決方案。

http://blogs.msdn.com/b/distributedservices/archive/2009/02/12/client-proxy-close-method-call-does-not-finish-immediately-in-one-way-wcf-calls.aspx

從文章:

問題:客戶端調用代理的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());` 
+1

你不應該只是給另一個網站的鏈接作爲答案,因爲該網站可能會在未來過時。相反,單擊此答案上的「編輯」鏈接,並在此處包含解決方案的主要部分。請參閱:http://meta.stackexchange.com/q/8259 – 2012-02-12 08:40:15

+0

謝謝,我會這樣做。 – 2012-02-13 14:11:22