使用 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();

如果问题仍然存在,请随时告诉我。