2010-02-01 74 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