【问题标题】:Calling Service Lbrary from Web Project - What Goes In Web.Config?从 Web 项目调用服务库 - Web.Config 中有什么?
【发布时间】:2010-12-09 23:16:07
【问题描述】:

我是 WCF 的新手,正在做一个项目 我正在构建一个名为的 WCF 库 通过 Web 项目 (ASP.NET 2.03.5 / C#)。

我这里有一些事情要做。

1) 我为我的客户提供了一份恭维合同 (IJSON) 我的 JSON Web 方法的 SOAP 合同 (ISOAP)。 2) 我有一份合同,IFileTransferService,负责处理 文件流式传输。

你能看看我的APP.CONFIG和WEB.CONFIG吗 文件并告诉我它们是否正确或我是否正在复制 我的 Web.Config 中的 App.Config 中的那个是不必要的? 如果我使用的是服务库,我真的需要这样做吗 事情两次(声明服务,绑定等)?这看起来 正确的?

此外,任何其他风格/建设性的 cmets 我在 system.serviceModel 中所拥有的总是受到赞赏。

感谢您的宝贵时间。

WEB.CONFIG

<system.serviceModel>
    <client>
      <endpoint name="MySOAPAuthEP" 
                address="http://localhost:1241/WebProj/auth.svc/soap"
                binding="basicHttpBinding" 
                bindingConfiguration="soapWeb" 
                contract="Project.WebAPI.Authentication.ISOAPAuthService" />
      <endpoint name="MySOAPTradeEP"
                address="http://localhost:1241/WebProj/trade.svc/soap"
                binding="basicHttpBinding" 
                bindingConfiguration="soapWeb" 
                contract="Project.WebAPI.Trade.ISOAPTradeService" />
      <endpoint name="MySOAPFileTransferEP"
                address="http://localhost:1241/WebProj/filetransfer.svc/soap"
                binding="basicHttpBinding" 
                bindingConfiguration="httpLargeDataStream"
                contract="Project.WebAPI.FileTransfer.ISOAPFileTransferService" />

      <endpoint name="MyJSONAuthEP"
                binding="webHttpBinding" 
                bindingConfiguration="jsonWeb"
                contract="Project.WebAPI.Authentication.IJSONAuthService"  />
      <endpoint name="MyJSONTradeEP"
                binding="webHttpBinding" 
                bindingConfiguration="jsonWeb"
                contract="Project.WebAPI.Trade.IJSONTradeService"  />
      <endpoint name="MyJSONFileTransferEP"
                binding="webHttpBinding" 
                bindingConfiguration="jsonWeb"
                contract="Project.WebAPI.FileTransfer.IJSONFileTransferService" />
    </client>
    <bindings>
      <basicHttpBinding>
        <binding name="soapWeb" />
        <binding name="httpLargeDataStream" closeTimeout="00:01:00" openTimeout="00:01:00"
          receiveTimeout="00:10:00" sendTimeout="00:01:00" maxBufferSize="65536"
          maxReceivedMessageSize="2147483647" messageEncoding="Mtom" transferMode="Streamed">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
            maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None" />
          </security>
        </binding>
      </basicHttpBinding>
      <webHttpBinding>
        <binding name="jsonWeb" maxBufferSize="1500000" maxBufferPoolSize="1500000"
          maxReceivedMessageSize="1500000">
          <readerQuotas maxDepth="32" maxStringContentLength="656000" maxArrayLength="656000"
            maxBytesPerRead="656000" maxNameTableCharCount="656000" />
        </binding>
      </webHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="WebHttpEPBehavior">
          <webHttp />
        </behavior>
        <behavior name="BasicHttpEPBehavior" />
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="Default">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
      <service behaviorConfiguration="Default" name="Project.WebAPI.Trade.TradeService">
        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
          binding="webHttpBinding" name="MyJSONTradeEP" contract="Project.WebAPI.Trade.IJSONTradeService" />
        <endpoint address="soap" binding="basicHttpBinding" name="MySOAPTradeEP"
          contract="Project.WebAPI.Trade.ISOAPTradeService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1243/WebProj/trade.svc" />
          </baseAddresses>
        </host>
      </service>
      <service behaviorConfiguration="Default" name="Project.WebAPI.Authentication.AuthService">
        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
          binding="webHttpBinding" name="MyJSONAuthEP" contract="Project.WebAPI.Authentication.IJSONAuthService" />
        <endpoint address="soap" binding="basicHttpBinding" name="MySOAPAuthEP"
          contract="Project.WebAPI.Authentication.ISOAPAuthService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1242/WebProj/auth.svc" />
          </baseAddresses>
        </host>
      </service>
      <service behaviorConfiguration="Default" name="Project.WebAPI.FileTransfer.FileTransferService">

        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
                  binding="webHttpBinding" name="MyJSONFileTransferEP" contract="Project.WebAPI.FileTransfer.IJSONFileTransferService" />

        <endpoint address="soap" 
                  binding="basicHttpBinding" 
                  name="MySOAPFileTransferEP"
                  bindingConfiguration="httpLargeDataStream"
                  contract="Project.WebAPI.FileTransfer.ISOAPFileTransferService" />

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1244/WebProj/filetransfer.svc" />
          </baseAddresses>
        </host>
      </service>
    </services>
  </system.serviceModel>

APP.CONFIG

  <system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
    <bindings>
      <basicHttpBinding>
        <binding name="soapWeb" />
        <binding name="httpLargeDataStream"
                 maxReceivedMessageSize="2147483647"
                 closeTimeout="00:01:00"
                 openTimeout="00:01:00"
                 receiveTimeout="00:10:00"
                 sendTimeout="00:01:00"
                 transferMode="Streamed"
                 messageEncoding="Mtom"
                 maxBufferSize="65536">
          <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
                maxBytesPerRead="4096" maxNameTableCharCount="16384" />
          <security mode="None">
            <transport clientCredentialType="None"/>
          </security>
        </binding>
      </basicHttpBinding>
      <webHttpBinding>
        <binding name="jsonWeb" maxBufferSize="1500000" maxBufferPoolSize="1500000"
          maxReceivedMessageSize="1500000">
          <readerQuotas maxDepth="32" maxStringContentLength="656000" maxArrayLength="656000"
            maxBytesPerRead="656000" maxNameTableCharCount="656000" />
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service behaviorConfiguration="Default" name="Project.WebAPI.Trade.TradeService">
        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
          binding="webHttpBinding" name="MyJSONTradeEP" contract="Project.WebAPI.Trade.IJSONTradeService" />
        <endpoint address="soap" binding="basicHttpBinding" name="MySOAPTradeEP"
          contract="Project.WebAPI.Trade.ISOAPTradeService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1243/WebProj/trade.svc" />
          </baseAddresses>
        </host>
      </service>
      <service behaviorConfiguration="Default" name="Project.WebAPI.Authentication.AuthService">
        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
          binding="webHttpBinding" name="MyJSONAuthEP" contract="Project.WebAPI.Authentication.IJSONAuthService" />
        <endpoint address="soap" binding="basicHttpBinding" name="MySOAPAuthEP"
          contract="Project.WebAPI.Authentication.ISOAPAuthService" />
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1242/WebProj/auth.svc" />
          </baseAddresses>
        </host>
      </service>
      <service behaviorConfiguration="Default" name="Project.WebAPI.FileTransfer.FileTransferService">
        <endpoint address="json" behaviorConfiguration="WebHttpEPBehavior"
                  binding="webHttpBinding" name="MyJSONFileTransferEP" contract="Project.WebAPI.FileTransfer.IJSONFileTransferService" />

        <endpoint address="soap" binding="basicHttpBinding" name="MySOAPFileTransferEP"
                  contract="Project.WebAPI.FileTransfer.ISOAPFileTransferService" />

        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:1244/WebProj/filetransfer.svc" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="WebHttpEPBehavior">
          <webHttp />
        </behavior>
        <behavior name="BasicHttpEPBehavior" />
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="Default">
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

【问题讨论】:

    标签: wcf web-config app-config


    【解决方案1】:

    几个 cmets 可帮助您整理配置文件并使它们更具可读性:

    • 您的 web.config 和 app.config 中有 &lt;services&gt;&lt;client&gt; 部分。为什么?这通常不是必需的 - 服务器端(您的服务器代码运行的地方)需要 &lt;services&gt;,而调用服务器的客户端只需要 &lt;client&gt; 部分
    • 您似乎已使用 Visual Studio 或 svcutil.exe 创建配置,因为您的绑定配置还列出了所有绑定默认值(这是您拥有的大量设置)。您可以减少它以仅保留您针对特定场景实际更改的设置,从而使配置更小且更易于理解
    • 您真的需要&lt;serviceHostingEnvironment aspNetCompatibilityEnabled="true"/&gt; 设置吗?这基本上“伪造”了 WCF 服务中的 HttpContext,使它们看起来和行为很像 ASMX Web 服务 - 你需要这个吗?
    • &lt;serviceDebug includeExceptionDetailInFaults="true" /&gt; 此处的此设置在开发/测试环境中可能有用且正常,但我绝对建议将其删除以用于生产
    • 您是自托管还是在 IIS 中托管?如果您使用 IIS 托管,则不会使用定义的 &lt;baseAddress&gt; 条目;在 IIS 托管环境中,基地址被忽略,因为 *.svc 文件的位置(它所在的虚拟目录)是您的基地址,您不能覆盖它

    乍一看就是这样:-)

    马克

    【讨论】:

    • 谢谢马克。我听从了你的建议,只是离开了我的 web.config 中的 部分,但现在似乎无法让它运行。我收到以下错误:服务“AuthService”的应用程序(非基础设施)端点为零。这可能是因为没有为您的应用程序找到配置文件,或者因为在配置文件中找不到与服务名称匹配的服务元素,或者因为在服务元素中没有定义端点。我记得当我开始并通过在 Web.config 中转储服务和绑定来解决它时遇到了这个错误。想法?再次感谢。
    • 您在哪里托管您的服务类? IIS?然后,您需要 web.config 中的 &lt;services&gt;,以及访问该服务的客户端 app.config 中的 &lt;client&gt;(但没有“服务”)
    • 再次感谢。不,我现在正在为开发自行托管。
    • 我的 web.config 看起来需要 的东西——否则我无法让它运行。一旦我将所有内容添加回文件中,就可以正常工作。哦,好吧 - 如果它没有损坏,请不要修复它,对吗?再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多