WCF端点。多个客户端

时间:2013-08-24 05:05:32

标签: c# wcf web-services

我有一个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()}

我很感激我对错误的指导。

由于

2 个答案:

答案 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

两个服务器端端点都将由相同的服务代码处理 - 它只是端点(以及端点理解的协议)不同