使用 IIS 托管服务的问题 - 本地和远程
Problem consuming IIS hosted service - locally and remotely
我为我目前正在进行的项目构建了 2 个服务。
1) 使用 basicHttpBinding 的简单客户端-服务器请求服务
2) 使用 WSDualHttpBinding 的回调数据服务
通过一些操作,我能够在 IIS 中托管两者,并且我可以在我的浏览器中本地访问 :/Service.svc,也可以在另一台也将与这两种服务交互的机器上访问。
这里是回调数据服务的应用程序配置部分
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="myBehavior">
<clientVia />
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<wsDualHttpBinding>
<binding name="WSDualHttpBinding_IDataService">
<security mode="None">
<message negotiateServiceCredential="false" clientCredentialType="None" />
</security>
</binding>
</wsDualHttpBinding>
</bindings>
<client>
<endpoint address="http://<address>:50111/Service.svc/service"
binding="wsDualHttpBinding" bindingConfiguration="WSDualHttpBinding_IDataService" behaviorConfiguration="myBehavior"
contract="CallbackService.IDataService" name="WSDualHttpBinding_IDataService">
</endpoint>
</client>
</system.serviceModel>
basicHttpBinding 看起来非常相似 - 只是到另一个端口
我将 IIS 设置为匿名身份验证..用户 IUSR,没有密码..
最初它在本地工作 - 但我从远程计算机收到身份验证错误..所以我做了一些调整 - 现在我什至在本地也超时了..尽管 Visual Studio 与服务引用交互服务还行
如何再次获得服务"to cooperate"
我无计可施 - 非常感谢任何帮助!?
编辑:第一个问题已解决 - 本地通信已恢复
public ClientCallbacks myCallbacks=new ClientCallbacks();
public DuplexChannelFactory<IDataService> channelFactory { get; set; }
public IDataService channel;
public int connect() {
WSDualHttpBinding binding = new WSDualHttpBinding()
{ Name = "WSDualHttpBinding_IDataService" };
this.channelFactory = new DuplexChannelFactory<IDataService>(
mainForm.dbCommunication.myCallbacks,
binding,
new EndpointAddress("http://<address>:50111/Service.svc/service"));
this.channel = this.channelFactory.CreateChannel();
...
...
channel.AddListener(int-parameter); // announce new callback-partner
...
...
this.newListe = this.myCallbacks.receivedTaskList; //get Tasklist over callback
这在本地有效 - 但远程调用它时我收到 "new" 错误
System.ServiceModel.Security.SecurityNegotiationException:
The caller was not authenticated by the service. --->
System.ServiceModel.FaultException: The request for security token could not be satisfied
because authentication failed.
at System.ServiceModel.Security.SecurityUtils.ThrowIfNegotiationFault
(Message message, EndpointAddress target)
at System.ServiceModel.Security.SspiNegotiationTokenProvider.GetNextOutgoingMessageBody
(Message incomingMessage, SspiNegotiationTokenProviderState sspiState)
--- End of inner exception stack trace ---
我再次努力寻找线索/解决方案..我将 IIS 身份验证设置为匿名...但似乎在达到该点之前通信已被阻止..我必须做什么才能获得服务来自远程机器?
看来我们应该提供凭据让服务器端对客户端进行身份验证。应提供哪种凭据取决于服务器端的绑定配置。
默认。 WsDualhttpbinding
的安全模式配置为Message安全模式,客户端凭证类型为Windows.
以下这些代码片段是等效的。
WSDualHttpBinding binding = new WSDualHttpBinding();
WSDualHttpBinding binding = new WSDualHttpBinding();
binding.Security.Mode = WSDualHttpSecurityMode.Message;
binding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
从你的代码片段中,我没有看到你对服务器端的配置。如果需要 Windows 凭据,请考虑以下代码段。
//ChannelFactory<IService> channelFactory = new ChannelFactory(...);
channelFactory.Credentials.Windows.ClientCredential.UserName = "administrator";
channelFactory.Credentials.Windows.ClientCredential.Password = "123456";
IService svc = channelFactory.CreateChannel();
如果问题仍然存在,请随时告诉我。