如何实现单向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