【问题标题】:Adding WCF serivce reference, or using svcutil.exe for my own WCF service添加 WCF 服务引用,或将 svcutil.exe 用于我自己的 WCF 服务
【发布时间】:2011-12-24 18:45:08
【问题描述】:

我在添加我开发的 WCF 服务时遇到问题。 WCF 配置为使用证书。它正在工作,但由于某些原因现在不行。以下是我尝试过的L

场景 1:

在网络浏览器上浏览https://depart.MyDomain.com/ver.svc?wsdl时,它确实显示xml,但显示:

You have created a service.

To test this service, you will need to create a client and use it to call the service. You can do this using the svcutil.exe tool from the command line with the following syntax:

svcutil.exe http://depart.MyDomain.com/ver.svc?wsdl 

.....
.....

场景 2:

下面运行svcutil.exe时:

svcutil.exe https://depart.MyDomain.com/ver.svc?wsdl

它生成:

 Attempting to download metadata from 'https://depart.Mydomain.com/Ver.svc?wsdl' using WS-Metadata Exchange or DISCO.
Microsoft (R) Service Model Metadata Tool
[Microsoft (R) Windows (R) Communication Foundation, Version 4.0.30319.1]
Copyright (c) Microsoft Corporation.  All rights reserved.

Error: Cannot obtain Metadata from https://depart.Mydomain.com/Ver.svc?wsdl

If this is a Windows (R) Communication Foundation service to which you have access, please check that you have enabled metadata publishing at the specified addr
ess.  For help enabling metadata publishing, please refer to the MSDN documentation at http://go.microsoft.com/fwlink/?LinkId=65455.


WS-Metadata Exchange Error
    URI: https://depart.Mydomain.com/Ver.svc?wsdl

    Metadata contains a reference that cannot be resolved: 'https://depart.Mydomain.com/Ver.svc?wsdl'.

    <?xml version="1.0" encoding="utf-16"?><Fault xmlns="http://www.w3.org/2003/05/soap-envelope"><Code><Value>Sender</Value><Subcode><Value xmlns:a="http://doc
s.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">a:InvalidSecurity</Value></Subcode></Code><Reason><Text xml:lang="en-GB">An error occur
red when verifying security for the message.</Text></Reason></Fault>


HTTP GET Error
    URI: https://depart.Mydomain.com/Ver.svc?wsdl

    The document at the url https://depart.Mydomain.com/Ver.svc?wsdl was not recognized as a known document type.
The error message from each known type may help you fix the problem:
- Report from 'XML Schema' is 'The document format is not recognized (the content type is 'text/html; charset=UTF-8').'.
- Report from 'DISCO Document' is 'There was an error downloading 'https://depart.Mydomain.com/Ver.svc?disco'.'.
  - The request failed with HTTP status 403: Forbidden.
- Report from 'https://depart.Mydomain.com/Ver.svc?wsdl' is 'The document format is not recognized (the content type is 'text/html; ch
arset=UTF-8').'.
- Report from 'WSDL Document' is 'The document format is not recognized (the content type is 'text/html; charset=UTF-8').'.

场景 3:

当我尝试在 Visual Studio 2010 中添加服务引用时,它会在场景 2 中生成类似的错误

下面是web.config:

   <system.serviceModel>
    <diagnostics>
      <messageLogging logEntireMessage="true" logMalformedMessages="true"
        logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="false" />
    </diagnostics>
    <services>
      <service behaviorConfiguration="VServiceBehaviour"
               name="Ver.Service">
        <endpoint address="ver" listenUri="" binding="wsHttpBinding" bindingConfiguration="wshttpbindingcfg"
                   contract="Ver.IVer" bindingNamespace="http://www.MyDomain.com/ver" behaviorConfiguration ="VerEndpointBehaviour">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" bindingConfiguration="mexhttpbinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://depart.MyDomain.com/" />
          </baseAddresses>
        </host>
      </service>    
    </services>
    <bindings>
      <mexHttpBinding>
        <binding name="mexhttpbinding" />
      </mexHttpBinding>
      <wsHttpBinding>

        <binding name="wshttpbindingcfg" maxReceivedMessageSize="2000000000" sendTimeout="00:10:00">
          <readerQuotas maxStringContentLength="2000000000"/>

          <security mode="TransportWithMessageCredential">
            <message clientCredentialType="Certificate" establishSecurityContext="False" negotiateServiceCredential="False" algorithmSuite="Default"/>
          </security>

        </binding>
      </wsHttpBinding>
    </bindings>
    <behaviors>
      <endpointBehaviors>
        <behavior name="VerEndpointBehaviour">
          <instanceContextBehavior/>
          <verInspectorBehavior/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior name="VServiceBehaviour">
          <dataContractSerializer maxItemsInObjectGraph="100000000"/>
          <serviceMetadata httpGetEnabled="true" />
          <serviceDebug includeExceptionDetailInFaults="true" />

          <serviceCredentials>
            <clientCertificate>
              <authentication certificateValidationMode="PeerOrChainTrust" trustedStoreLocation="LocalMachine" mapClientCertificateToWindowsAccount="false"/>
            </clientCertificate>

            <serviceCertificate
               x509FindType="FindByThumbprint"
               findValue="xxx"
               storeLocation="LocalMachine"
               storeName="My"/>
          </serviceCredentials>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

提前感谢您的任何建议!

【问题讨论】:

    标签: wcf wcf-binding wcf-security wcf-client


    【解决方案1】:

    对于安全的通信渠道,使用 mexHttpsBinding(带有附加的 s)而不是 mexHttpBinding,请参阅:http://msdn.microsoft.com/en-us/library/aa967391.aspx 并替换

    <serviceMetadata httpGetEnabled="true" /> 
    

    通过

    <serviceMetadata httpsGetEnabled="true" /> 
    

    还有附加的 s。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-14
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 2015-04-15
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      相关资源
      最近更新 更多