WCF Web 服务客户端抛出 404 EndPointNotFoundException
WCF Web Service Client throwing 404 EndPointNotFoundException
我有一个解决方案,其中包括一个 WCF Web 服务项目和一个 WPF 客户端项目,它们在本地运行良好。我有一个专用的 IIS Web 服务器,我已在其上部署了 WCF Web 服务项目。 IIS 站点配置了 SSL 证书并设置为需要 SSL。该站点具有 HTTPS 绑定,绑定到默认端口上的特定 DNS 主机名和所有 IP 地址(只有一个)。
我可以在服务器或客户端的浏览器中毫无问题地访问端点地址和 WSDL。该组织使用代理服务器,但我认为这不会妨碍客户端和服务器之间没有防火墙。
这是我在服务器上的web.config:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="DefaultBinding" maxReceivedMessageSize="1000000000">
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None">
<extendedProtectionPolicy policyEnforcement="Never" />
</transport>
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="Hca.Ims.Wcf.ImsService">
<endpoint
name="Hca.Ims.Wcf.ImsService"
address="/ImsService.svc"
binding="wsHttpBinding"
bindingConfiguration="DefaultBinding"
contract="Hca.Ims.DataAccess.DataContracts.IImsDataContract" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<directoryBrowse enabled="true" />
<httpErrors errorMode="Detailed" />
</system.webServer>
</configuration>
这是我的客户app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
[...]
<system.net>
<defaultProxy enabled="false" />
</system.net>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="DefaultBinding" receiveTimeout="00:30:00"
sendTimeout="00:30:00" maxReceivedMessageSize="1000000000">
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" >
<extendedProtectionPolicy policyEnforcement="Never" />
</transport >
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="https://mydnsname/ImsService.svc" binding="wsHttpBinding"
bindingConfiguration="DefaultBinding" contract="ImsService.IImsDataContract"
name="Hca.Ims.Wcf.ImsService" />
</client>
</system.serviceModel>
</configuration>
这里是一些调用代码:
var webClient = new System.Net.WebClient();
//Works
var webResult = webClient.DownloadString("https://mydnsname/ImsService.svc");
var wcfClient = new ImsDataContractClient("Hca.Ims.Wcf.ImsService");
//Crashes
var wcfResult = wcfClient.GetUserInfo("SomeUserId");
结果:
EndPointNotFoundException:
在 https://mydnsname/ImsService.svc 处没有侦听可以接受消息的端点。这通常是由不正确的地址或 SOAP 操作引起的。有关详细信息,请参阅 InnerException(如果存在)。
内部异常:
"The remote server returned an error: (404) Not Found."
谁能看出我做错了什么?顺便说一下,我从 basicHttpsBinding 开始,它有同样的问题。
您的合同不匹配。
您的服务器已为此合同设置;
contract="Hca.Ims.DataAccess.DataContracts.IImsDataContract"
您的客户端端点是为另一个合同设置的
contract="ImsService.IImsDataContract"
这些需要匹配。
解决了。我曾尝试在端点地址中使用相对路径。他们不工作。一旦我将完整的 URL 放入 web.config 端点地址,它就可以工作了。
我有一个解决方案,其中包括一个 WCF Web 服务项目和一个 WPF 客户端项目,它们在本地运行良好。我有一个专用的 IIS Web 服务器,我已在其上部署了 WCF Web 服务项目。 IIS 站点配置了 SSL 证书并设置为需要 SSL。该站点具有 HTTPS 绑定,绑定到默认端口上的特定 DNS 主机名和所有 IP 地址(只有一个)。
我可以在服务器或客户端的浏览器中毫无问题地访问端点地址和 WSDL。该组织使用代理服务器,但我认为这不会妨碍客户端和服务器之间没有防火墙。
这是我在服务器上的web.config:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="DefaultBinding" maxReceivedMessageSize="1000000000">
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None">
<extendedProtectionPolicy policyEnforcement="Never" />
</transport>
</security>
</binding>
</wsHttpBinding>
</bindings>
<services>
<service name="Hca.Ims.Wcf.ImsService">
<endpoint
name="Hca.Ims.Wcf.ImsService"
address="/ImsService.svc"
binding="wsHttpBinding"
bindingConfiguration="DefaultBinding"
contract="Hca.Ims.DataAccess.DataContracts.IImsDataContract" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="true" />
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="false" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true" />
<directoryBrowse enabled="true" />
<httpErrors errorMode="Detailed" />
</system.webServer>
</configuration>
这是我的客户app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
[...]
<system.net>
<defaultProxy enabled="false" />
</system.net>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="DefaultBinding" receiveTimeout="00:30:00"
sendTimeout="00:30:00" maxReceivedMessageSize="1000000000">
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None" >
<extendedProtectionPolicy policyEnforcement="Never" />
</transport >
</security>
</binding>
</wsHttpBinding>
</bindings>
<client>
<endpoint address="https://mydnsname/ImsService.svc" binding="wsHttpBinding"
bindingConfiguration="DefaultBinding" contract="ImsService.IImsDataContract"
name="Hca.Ims.Wcf.ImsService" />
</client>
</system.serviceModel>
</configuration>
这里是一些调用代码:
var webClient = new System.Net.WebClient();
//Works
var webResult = webClient.DownloadString("https://mydnsname/ImsService.svc");
var wcfClient = new ImsDataContractClient("Hca.Ims.Wcf.ImsService");
//Crashes
var wcfResult = wcfClient.GetUserInfo("SomeUserId");
结果:
EndPointNotFoundException: 在 https://mydnsname/ImsService.svc 处没有侦听可以接受消息的端点。这通常是由不正确的地址或 SOAP 操作引起的。有关详细信息,请参阅 InnerException(如果存在)。
内部异常: "The remote server returned an error: (404) Not Found."
谁能看出我做错了什么?顺便说一下,我从 basicHttpsBinding 开始,它有同样的问题。
您的合同不匹配。
您的服务器已为此合同设置;
contract="Hca.Ims.DataAccess.DataContracts.IImsDataContract"
您的客户端端点是为另一个合同设置的
contract="ImsService.IImsDataContract"
这些需要匹配。
解决了。我曾尝试在端点地址中使用相对路径。他们不工作。一旦我将完整的 URL 放入 web.config 端点地址,它就可以工作了。