Как реализовать IsOneWay=true в WCF nettcpBinding

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

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

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

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

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

2 ответа

У нас была проблема с односторонними вызовами, которые не возвращались немедленно с помощью 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 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());`

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

Если вам интересно, глава 5 удивительного программирования Юваля Лоуи WCF Services 2nd Edition содержит много информации об односторонних услугах.

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

Другие вопросы по тегам