#c# #web-services #wcf #nettcpbinding
#c# #веб-сервисы #wcf #nettcpbinding
Вопрос:
Я создал службу wcf с nettcpbinding (режим безопасности = «Нет»). Разместил ее в IIS .. она запускается в браузере:
net.tcp://localhost/NetTcptest/Service1.svc/mex
Когда я использую эту службу, используя ссылку на службу, она работает.
но когда я пытаюсь использовать фабрику каналов, это выдает ошибку:
Это может быть связано либо с несоответствием контракта (несовпадающие действия между отправителем и получателем), либо с несоответствием привязки / безопасности между отправителем и получателем. Убедитесь, что отправитель и получатель имеют одинаковый контракт и одинаковую привязку (включая требования безопасности, например, сообщение, транспорт, Нет).
Я не понимаю, что не так в моем коде.
моя веб-конфигурация службы:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<!--All Bindings Information-->
<bindings>
<netTcpBinding>
<binding name="netTcpBindingConfig">
<security mode="None">
<transport clientCredentialType="None" protectionLevel="None"/>
<message clientCredentialType="None" algorithmSuite="Default"/>
</security>
</binding>
</netTcpBinding>
</bindings>
<!--All Service Information-->
<services>
<service name="NetTcpTest.Service1" behaviorConfiguration="netTcpServiceBehavior">
<endpoint address="NetTcpTest"
contract="NetTcpTest.IService1"
binding="netTcpBinding"
bindingConfiguration="netTcpBindingConfig"/>
<endpoint address="mex"
binding="mexTcpBinding"
contract="IMetadataExchange"/>
<host>
<baseAddresses >
<!--<add baseAddress ="http://localhost:8080"/>-->
<add baseAddress ="net.tcp://localhost/Service1.svc"/>
</baseAddresses>
</host>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="netTcpServiceBehavior">
<serviceMetadata httpGetEnabled="false" httpGetUrl=""/>
<serviceDebug includeExceptionDetailInFaults="false"/>
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Также мой тестовый код приложения:
private void CallService_1_Click(object sender, EventArgs e)
{
try
{
string _uri = "net.tcp://localhost/NetTcptest/Service1.svc/mex";
NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.None;
binding.Security.Transport.ClientCredentialType = TcpClientCredentialType.None;
binding.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.None;
binding.Security.Message.ClientCredentialType = MessageCredentialType.None;
EndpointAddress address = new EndpointAddress(_uri);
ChannelFactory<IService1> channel = new ChannelFactory<IService1>(binding, address);
IService1 clientProxy = channel.CreateChannel();
label1.Text = clientProxy.GetData(100);
}
catch (Exception ex)
{
label1.Text = ex.Message;
}
}
Комментарии:
1. Проблема в том, что вы создаете конфигурацию своего клиентского канала в коде. Попробуйте использовать config и скопируйте файл конфигурации из службы, изменив его для определения клиентского канала. Или используйте конфигурацию ссылки на службу generate и измените use it в своем channelfactory.
2. Проверьте файл App.Config клиента.
3. спасибо за ответ, но я хочу создать его в коде, а не в файле конфигурации приложения….