Как реализовать IsOneWay = true в WCF nettcpBinding - PullRequest
1 голос
/ 01 февраля 2010

Как я могу реализовать односторонние операции WCF?

Я только что попытался использовать атрибут IsOneWay как:

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

Есть ли какие-либо другие изменения, которые мне нужно внести, или какие-либо конкретные изменения в app.config?

Кстати, моя служба WCF реализует netTcpBinding, хотя я думаю, что это не должно иметь никакого значения.

Ответы [ 2 ]

1 голос
/ 12 февраля 2012

У нас была проблема с односторонними вызовами, которые не возвращались немедленно с помощью 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 на прокси-сервере не возвращается до тех пор, пока вызов не будет фактически завершен или время ожидания не истечет.Вы когда-нибудь задумывались, почему это происходит?

Причина: когда вы указываете «Односторонний» на вашем интерфейсе, базовая операция канала все еще двусторонняя, так как элемент одностороннего связывания не находится встек каналов.Таким образом, операция закрытия блокируется до завершения операции в одну сторону.

Это сделано специально, и команда разработчиков работает над ее изменением в будущих версиях .Net framework.

...

Решение (Обойти):

Сложить элемент 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());`
1 голос
/ 01 февраля 2010

Как показано, ваш код выглядит нормально. Не должно быть проблем с выполнением односторонних вызовов с помощью netTcpBinding.

Если вам интересно, глава 5 в Juval Lowy's awesome Программирование служб WCF 2-е издание содержит много информации об односторонних услугах.

Из того, что вы показали, пока я не вижу ничего плохого. Пожалуйста, дайте нам более подробную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...