Служба WCF net.tcp по проблеме IIS
Я работаю над проектом клиент-сервер, в котором клиенты развертываются через Интернет. Все услуги написаны в WCF и используют wsHttpBinding
, Мне нужно реализовать функцию обратного вызова клиента, и поскольку клиенты находятся за брандмауэрами и NAT, мне сказали, что я могу использовать netTcpBinding
который обходит брандмауэр /NAT. Таким образом, я создал сервис и договор обратного вызова.
На стороне клиента, вот как я пытаюсь подключиться к нему:
var binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.UserName;
binding.MaxReceivedMessageSize = Int32.MaxValue;
binding.ReaderQuotas.MaxArrayLength = Int32.MaxValue;
AuthorizationToken authorizationToken =
new AuthorizationToken(Session.Current.Username, Session.Current.Password, RequiredPermission.User);
using (DuplexChannelFactory<INotificationService> channel =
new DuplexChannelFactory<INotificationService>(new InstanceContext(this), binding,
new EndpointAddress("net.tcp://mywebsite.com:808/MyServices/NotificationService.svc")))
{
channel.Credentials.UserName.UserName = authorizationToken.FormatTokenForTransmission();
channel.Credentials.ServiceCertificate.Authentication.CertificateValidationMode =
System.ServiceModel.Security.X509CertificateValidationMode.None;
INotificationService proxy = channel.CreateChannel();
proxy.Subscribe();
}
Код практически идентичен коду, который подключается к wsHttpBinding
услуги, за исключением типа привязки и ChannelFactory
, web.config
также выглядит так:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="wsHttpConfig" maxReceivedMessageSize="2147483647">
<security mode="Message" >
<message clientCredentialType="UserName"/>
</security>
<readerQuotas maxArrayLength="2147483647"/>
</binding>
</wsHttpBinding>
<netTcpBinding>
<binding name="netTcpConfig">
<security mode="Message" >
<message clientCredentialType="UserName"/>
</security>
<readerQuotas maxArrayLength="2147483647"/>
</binding>
</netTcpBinding>
</bindings>
<services>
<service name="MyProject.Services.NotificationService" behaviorConfiguration="authenticationBehavior">
<endpoint binding="netTcpBinding" bindingConfiguration="netTcpConfig"
contract="MyProject.ServiceContracts.INotificationService" />
<endpoint address="mex"
binding="mexTcpBinding"
bindingConfiguration=""
name="MyServiceMexTcpBidingEndpoint"
contract="IMetadataExchange" />
</service>
// other non-net.tcp services go here
</services>
<behaviors>
<serviceBehaviors>
<behavior name="authenticationBehavior">
<serviceMetadata httpGetEnabled="false" />
<serviceCredentials>
<serviceCertificate findValue="SomeCertificate" storeLocation="LocalMachine"
storeName="TrustedPeople" x509FindType="FindBySubjectName" />
<userNameAuthentication userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType="MyProject.Authentication.CustomAuthenticator, MyProject.Authentication" />
</serviceCredentials>
</behavior>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
</system.webServer>
</configuration>
Когда я звоню в сервис, запрос доходит до IIS
, но выдается исключение без внутреннего сообщения об исключении, и на стороне сервера я получаю следующий журнал трассировки:
The socket connection was aborted. This could be caused by an error processing
your message or a receive timeout being exceeded by the remote host, or an underlying
network resource issue. Local socket timeout was '00:01:00
Я понимаю, что это очень общая ошибка, и мой вопрос: вы видите что-то не так с моими настройками веб-конфигурации? Любая помощь приветствуется.
1 ответ
Там может быть несколько причин -
1) Проверьте, запущена ли служба адаптера net.tcp (даже попробуйте сбросить ее один раз). 2) Проверьте, настроена ли служба IIS на привязку Tcp. 3) Проверьте, открыты ли порты TCP. 4) Последняя попытка увеличить время ожидания.