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