首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在WCF nettcpBinding中实现IsOneWay=true

如何在WCF nettcpBinding中实现IsOneWay=true
EN

Stack Overflow用户
提问于 2010-02-01 22:30:08
回答 2查看 2.1K关注 0票数 1

如何实现单向的WCF操作?

我刚刚尝试使用IsOneWay属性作为:

代码语言:javascript
复制
[OperationContract(IsOneWay=true)]
void MethodName(string param1, int param2)

是否需要在app.config中进行任何其他更改或任何特定更改?

仅供参考,我的WCF服务实现了netTcpBinding,尽管我认为这不会有什么不同。

EN

回答 2

Stack Overflow用户

发布于 2010-02-01 23:25:58

如图所示,您的代码看起来没问题。使用netTcpBinding进行单向调用应该没有问题。

如果你感兴趣,Juval Lowy的“了不起的Programming WCF Services 2nd Edition”中的第5章包含了大量关于单向服务的信息。

从你所展示的,到目前为止,我看不出有什么问题。请给我们更多的细节。

票数 1
EN

Stack Overflow用户

发布于 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之上,如下面的代码所示。这样,在代理上的近距离调用将立即返回,并且最终单向调用将以火的形式返回并被遗忘。

代码语言:javascript
复制
[ServiceContract]
public interface IService1
{
    [OperationContract(IsOneWay = true)]
    void SetData(int value);
}

public class Service1 : IService1
{
    public void SetData(int value)
    {
         //Application specific code
    }
}

服务主机代码:

代码语言:javascript
复制
        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();

客户端代码:

代码语言:javascript
复制
 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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2177336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档