如何实现单向的WCF操作?
我刚刚尝试使用IsOneWay属性作为:
[OperationContract(IsOneWay=true)]
void MethodName(string param1, int param2)是否需要在app.config中进行任何其他更改或任何特定更改?
仅供参考,我的WCF服务实现了netTcpBinding,尽管我认为这不会有什么不同。
发布于 2010-02-01 23:25:58
如图所示,您的代码看起来没问题。使用netTcpBinding进行单向调用应该没有问题。
如果你感兴趣,Juval Lowy的“了不起的Programming WCF Services 2nd Edition”中的第5章包含了大量关于单向服务的信息。
从你所展示的,到目前为止,我看不出有什么问题。请给我们更多的细节。
发布于 2012-02-12 07:24:35
我们遇到了使用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服务中的单向方法,然后在代理上调用close方法,直到调用实际完成或调用超时才返回。有没有想过为什么会发生这种情况?
原因:当您在接口上指定“one - way”时,底层的通道操作仍然是双向的,因为单向绑定元素不在通道堆栈中。因此,关闭操作被阻塞,直到单向操作完成。
这是经过设计的,开发团队正在努力在.Net框架的未来版本中对其进行更改。
..。
解决方案(变通方法):
将OneWayBindingElement放在netTcpBinding之上,如下面的代码所示。这样,在代理上的近距离调用将立即返回,并且最终单向调用将以火的形式返回并被遗忘。
[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());`https://stackoverflow.com/questions/2177336
复制相似问题