添加WCF服务引用时,不会将配置详细信息添加到web.config

时间:2011-01-07 00:44:56

标签: wcf visual-studio-2010

我正在尝试使用VS2010向我的Web应用程序添加WCF服务引用。它似乎添加OK,但web.config没有更新,这意味着我得到了一个运行时异常:

  

无法找到默认端点   引用合同的元素   'CoolService.CoolService'中   ServiceModel客户端配置   部分。这可能是因为没有   找到了您的配置文件   应用程序,或因为没有端点   匹配此合同的元素可以   可以在客户端元素中找到。

显然,因为我的web.config中没有定义服务。重现的步骤:

  1. 右键单击解决方案>添加>新项目> ASP.NET空Web应用程序。
  2. 右键单击新网络应用中的服务参考>添加服务参考。
  3. 输入我的服务地址,然后单击“执行”。我的服务在左侧的“服务”部分中可见,我可以看到它的所有操作。
  4. 为我的服务键入命名空间。
  5. 单击“确定”。正确生成服务引用,我可以打开Reference.cs文件,看起来一切正常。
  6. 打开web.config文件。 它仍然是空的

    <system.web>
        <compilation debug="true" targetFramework="4.0" />
    </system.web>
    
    
    <system.serviceModel>
        <bindings />
        <client />
    </system.serviceModel>
    

  7. 为什么会这样?它也适用于控制台应用程序或我尝试的任何其他项目类型。有什么帮助吗?

    以下是我的WCF服务中的app.config:

    <?xml version="1.0"?>
    
    <configuration>
    
      <system.web>
        <compilation debug="true" />
      </system.web>
      <!-- When deploying the service library project, the content of the config file must be added to the host's 
      app.config file. System.Configuration does not support config files for libraries. -->
      <system.serviceModel>
    
        <services>
    
          <service name="CoolSQL.Server.WCF.CoolService">
    
            <endpoint address=""
              binding="webHttpBinding"
              contract="CoolSQL.Server.WCF.CoolService"
              behaviorConfiguration="SilverlightFaultBehavior">
              <identity>
                <dns value="localhost" />
              </identity>
            </endpoint>
    
            <endpoint address="mex"
              binding="mexHttpBinding"
              contract="IMetadataExchange" />
    
            <host>
              <baseAddresses>
                <add baseAddress="http://localhost:8732/Design_Time_Addresses/CoolSQL.Server.WCF/CoolService/" />
              </baseAddresses>
            </host>
    
          </service>
    
        </services>
    
        <behaviors>
          <endpointBehaviors>
            <behavior name="webBehavior">
              <webHttp />
            </behavior>
            <behavior name="SilverlightFaultBehavior">
              <silverlightFaults />
            </behavior>
          </endpointBehaviors>
          <serviceBehaviors>
            <behavior name="">
              <serviceMetadata httpGetEnabled="true" />
              <serviceDebug includeExceptionDetailInFaults="true" />
            </behavior>
          </serviceBehaviors>
        </behaviors>
    
        <bindings>
    
          <webHttpBinding>
            <binding name="DefaultBinding"
              bypassProxyOnLocal="true"
              useDefaultWebProxy="false"
              hostNameComparisonMode="WeakWildcard"
              sendTimeout="00:05:00"
              openTimeout="00:05:00"
              receiveTimeout="00:00:10"
              maxReceivedMessageSize="2147483647"
              transferMode="Streamed">
              <readerQuotas maxArrayLength="2147483647"
                maxStringContentLength="2147483647" />
            </binding>
          </webHttpBinding>
    
        </bindings>
    
        <extensions>
          <behaviorExtensions>
            <add name="silverlightFaults"
              type="CoolSQL.Server.WCF.SilverlightFaultBehavior, CoolSQL.Server.WCF" />
          </behaviorExtensions>
        </extensions>
    
        <diagnostics>
          <messageLogging logEntireMessage="true"
            logMalformedMessages="false"
            logMessagesAtServiceLevel="true"
            logMessagesAtTransportLevel="false"
            maxMessagesToLog="3000"
            maxSizeOfMessageToLog="2000" />
        </diagnostics>
    
      </system.serviceModel>
    
      <startup>
        <supportedRuntime version="v4.0"
          sku=".NETFramework,Version=v4.0" />
      </startup>
    
      <system.diagnostics>
        <sources>
          <source name="System.ServiceModel.MessageLogging"
            switchValue="Information, ActivityTracing">
            <listeners>
              <add name="messages"
                type="System.Diagnostics.XmlWriterTraceListener"
                initializeData="c:\messages.e2e" />
            </listeners>
          </source>
        </sources>
      </system.diagnostics>
    
    </configuration>
    

1 个答案:

答案 0 :(得分:4)

我发现了如何解决这个问题。我的WCF服务在其自己的项目中实现,并由同一解决方案中的单独控制台应用程序托管。如果我将WCF服务作为解决方案的启动项目运行(例如,让VS为我托管),那么添加引用工作正常,并将正确的行添加到客户端web.config。但是如果我从我的控制台应用程序中托管服务,虽然我仍然可以添加引用,但客户端的web.config不会被修改。因此,解决方法是先让VS托管服务,然后添加引用,然后在控制台应用程序中更改要托管的服务(在同一地址和端口)。

这是令人惊讶的行为,我很好奇是否有人可以对此有所了解?