使用WsHttpBinding的客户端应用程序获得“没有端点监听...”

时间:2016-07-25 15:11:49

标签: web-services https wshttpbinding

我有一个客户端应用程序,它与我们在服务器上托管的Web服务进行通信(我们称之为 hostServer )。我的客户端应用程序可以使用 basicHttpBinding 进行构建和连接。但是,出于安全原因,我正试图强调 wsHttpBinding

上周午餐前,我发誓它正在使用硬编码证书。从午餐回来,检查我的代码,现在它不会运行。我一直得到“https://hostServer:1234/Service.svc/MyServiceName没有可以接受该消息的端点。这通常是由不正确的地址或SOAP操作引起的。”我已经尝试重新检查我的设置,回顾我的步骤,但似乎无法恢复到我所处的运行状态。

我使用的服务地址为“https:// hostServer:1234 / Service.svc?singleWsdl”。我可以毫无问题地导航到“https:// hostServer:1234 / Service.svc”并查看Wsdl。

我的客户端代码是

WSHttpBinding wsBinding = new WSHttpBinding(SecurityMode.Transport);
wsBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

Client = new MyServiceName(wsBinding, new EndpointAddress(endpoint));

Client.ClientCredentials.ClientCertificate.SetCertificate(
  StoreLocation.CurrentUser,
  StoreName.My,
  X509FindType.FindBySubjectName,
  "localCertName");

 Client.ChangePassword("test_user", "pt", "a1");

我的值端点 = https://hostServer:1234/Service.svc/MyServiceName

我的IIS站点设置了Http和Https的绑定(具有正确的IP和端口ID)

我真的需要让这个代码在起飞前工作(我的妻子应该在我们的第二个孩子的任何一天到期)。我一直在努力调试这个2天,除了我花时间站起来的时间。请帮忙。

1 个答案:

答案 0 :(得分:0)

所以我终于能够重新开始工作了。列出下面执行的步骤,希望它可以帮助其他人。

在IIS服务器(IIS管理器)上

修改了“网站绑定”以包含HTTP& HTTPS(带有不同的端口号)

将SSL设置设为“需要SSL”和“接受”

在IIS服务器上(Web.Config):

已添加

<bindings> 
  <wsHttpBinding> 
    <binding name="wsHttpEndpointBinding"> 
      <security mode="Transport"> 
        <transport clientCredentialType ="Certificate"/> 
      </security> 
    </binding> 
  </wsHttpBinding> 
</bindings>

到“System.ServiceModel”标记。

此外,将“bindingConfiguration =”wsHttpEndpointBinding“添加到我的端点。

代码

更新的端点地址,以使用在IIS服务器上生成的地址。

使用以下代码创建端点

 WSHttpBinding wsBinding = new WSHttpBinding(SecurityMode.Transport); 
    wsBinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate; 
    Client = new ServiceClient(wsBinding, new EndpointAddress(endpoint)); 
    Client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.LocalMac‌​hine, StoreName.My, X509FindType.FindByIssuerName, certName);