我有一个IIS托管的WCF Web服务。它始于两位消费者。
1)WinForm测试工具在同一解决方案中测试IDE中的WCF合同。
2)使用已发布版本的Asp.Net Web App。
所有人都可以开箱即用。
然后是第三个消费者,一个Android应用程序。要正确使用这个,必须使用JSON WebGets和Webinvokes修改WCF合同,并更改WCF Web.config以适应。
现在原来的两个消费者不再工作了。因此,我需要更改Web.config和/或App.configs以获得所有三个工作的配置。
首先关注IDE。我有WCF服务Web.Config的以下服务模型部分。
<system.serviceModel>
<client>
<endpoint binding="webHttpBinding" bindingConfiguration="JsonBinding"
contract="CouponParkingWCF.ICouponService" name="Json"
kind="" endpointConfiguration="">
<identity>
<certificateReference storeName="My" storeLocation="LocalMachine"
x509FindType="FindBySubjectDistinguishedName" />
</identity>
</endpoint>
<endpoint address="http://localhost:8707/CouponParking.svc"
binding="basicHttpBinding" contract="CouponParkingWCF.ICouponService"
name="BasicHttpBinding_ICouponService" />
</client>
<bindings>
<basicHttpBinding>
<binding name="basicHttp" />
</basicHttpBinding>
<webHttpBinding>
<binding name="JsonBinding" />
</webHttpBinding>
</bindings>
<services>
<service name="CouponParkingWCF.CouponService">
<endpoint behaviorConfiguration="JsonBehavior" binding="webHttpBinding"
bindingConfiguration="" name="jsonEndPoint"
contract="CouponParkingWCF.ICouponService" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="JsonBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<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>
WinForm测试工具App.config有:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttp" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://localhost:8707/CouponParking.svc"
binding="basicHttpBinding"
bindingConfiguration="BasicHttp"
contract="CouponParking.ICouponService"
name="BasicHttpBinding_ICouponService" />
</client>
</system.serviceModel>
我没有配置端点的经验,而且上面的内容基于示例和猜测。
当我运行测试工具时,wcf客户端实例化,但合同上的调用失败:
There was no endpoint listening at http://localhost:8707/CouponParking.svc
that could accept the message. This is often caused by an incorrect address
or SOAP action. See InnerException, if present, for more details."
内部例外是:
{"The remote server returned an error: (404) Not Found."}
[System.Net.WebException]: {"The remote server returned an error: (404) Not Found."}
Data: {System.Collections.ListDictionaryInternal}
HelpLink: null
HResult: -2146233079
InnerException: null
Message: "The remote server returned an error: (404) Not Found."
Source: "System"
StackTrace: " at System.Net.HttpWebRequest.GetResponse()\r\n at System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply(TimeSpan timeout)"
TargetSite: {System.Net.WebResponse GetResponse()}
我很感激我对错误的指导。
由于
答案 0 :(得分:4)
乍一看,您似乎已将客户端端点与服务配置文件中的服务端点混淆。客户端端点没有理由出现在服务的配置文件中,除非该服务本身正在调用另一个服务。
您的WinForm的配置文件是使用basicHttpBinding
定义客户端,但您没有使用BasicHttpBinding
公开服务端点,这很可能是您出错的原因得到了。
我会尝试删除服务配置文件中的客户端端点,并将它们添加到<services>
部分,如下所示:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="basicHttp" />
</basicHttpBinding>
<webHttpBinding>
<binding name="JsonBinding" />
</webHttpBinding>
</bindings>
<services>
<service name="CouponParkingWCF.CouponService">
<endpoint address="SOAP"
binding="basicHttpBinding"
contract="CouponParkingWCF.ICouponService"
name="BasicHttpBinding_ICouponService" />
<endpoint address="JSON"
binding="webHttpBinding" bindingConfiguration="JsonBinding"
contract="CouponParkingWCF.ICouponService" name="Json"
kind="" endpointConfiguration="">
<identity>
<certificateReference storeName="My" storeLocation="LocalMachine"
x509FindType="FindBySubjectDistinguishedName" />
</identity>
</endpoint>
</service>
</services>
记住WCF的ABC: A =地址, B =绑定和 C =合同 - 这三项定义了服务。< / p>
由于您添加了一个需要与测试工具或ASP.NET应用程序不同的绑定的客户端,因此需要使用该绑定公开第二个端点。
<强> EDITED 强>
正如@marc_s指出的那样,你需要两个不同的相对地址。我已经更新了配置文件以反映出来。
我自己没有机会使用多个端点,但我相信你会以这种方式使用它们,基地址由* .svc文件的位置提供:
http://localhost:8707/CouponParking.svc/SOAP
http://localhost:8707/CouponParking.svc/JSON
第一个是BasicHttpBinding
,第二个是WebHttpBinding
。
答案 1 :(得分:3)
您基本上只需要两个单独的端点来为您的Android客户端提供basicHttpBinding
(SOAP绑定)和webHttpBinding
(REST绑定)。
您的服务的“基本”地址由您的IIS虚拟目录和*.svc
文件所在的位置(http://localhost:8707/CouponParking.svc
)定义 - 因此这两个服务都可以在此“基本”地址和任何地址访问相对地址已定义
所以你需要配置这样的东西:
<services>
<service name="CouponParkingWCF.CouponService">
<!-- define the basicHttp (SOAP) endpoint at the base address -->
<endpoint name="SoapEndpoint"
address=""
binding="basicHttpBinding"
contract="CouponParkingWCF.ICouponService" />
<!-- define the REST endpoint at (base)+"/rest" -->
<endpoint name="RestEndpoint"
address="rest"
behaviorConfiguration="JsonBehavior"
binding="webHttpBinding"
contract="CouponParkingWCF.ICouponService" />
</service>
</services>
使用此设置,您应该能够使用basicHttpBinding
(SOAP)
http://yourServer:8707/CouponParking.svc
您应该能够在
访问基于REST的,支持JSON的端点http://yourServer:8707/CouponParking.svc/rest
两个服务器端端点都将由相同的服务代码处理 - 它只是端点(以及端点理解的协议)不同