如何从 POSTMAN 调用 WCF 服务方法

Posted

技术标签:

【中文标题】如何从 POSTMAN 调用 WCF 服务方法【英文标题】:How to call WCF service method from POSTMAN 【发布时间】:2016-05-07 16:26:21 【问题描述】:

我正在尝试使用 WCF 端点调用服务。 WCF 服务托管在 Windows 服务上,

这是配置。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.diagnostics>  
    <sources>
      <source name="System.ServiceModel" propagateActivity="true" switchValue="All">
        <listeners>
          <add name="xmlTraceListener" />
        </listeners>
      </source>
      <source name="System.ServiceModel.MessageLogging" switchValue="All">
        <listeners>
          <add name="xmlTraceListener" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="xmlTraceListener"
           type="System.Diagnostics.XmlWriterTraceListener"
           initializeData="C:\logwcf\Service.svclog" />
    </sharedListeners>
  </system.diagnostics>
  <system.web>
    <httpRuntime executionTimeout="90" />
  </system.web>
  <startup useLegacyV2RuntimeActivationPolicy="True">
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.1" />
  </startup>
  <system.serviceModel>
  <diagnostics>
        <messageLogging logEntireMessage="true" 
                        logMalformedMessages="true" 
                        logMessagesAtServiceLevel="true" 
                        logMessagesAtTransportLevel="true">
          <filters>
            <clear/>
          </filters>
        </messageLogging>
      </diagnostics>
    <bindings>
      <basicHttpBinding>
        <binding name="BasicHttpBinding_Hostware" closeTimeout="00:10:30" openTimeout="00:10:30" receiveTimeout="00:10:30" sendTimeout="00:10:30" allowCookies="false" bypassProxyOnLocal="false" maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" textEncoding="utf-8" transferMode="Streamed" useDefaultWebProxy="true" messageEncoding="Text">
          <readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647"/>
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"/>
          </security>
        </binding>
      </basicHttpBinding>
    </bindings>
    <services>
      <service name="xx.ServicioDistribucion.AnalisisDatos.Servicios.CuentasCobrar" behaviorConfiguration="behaviorDistribucion">
        <endpoint address="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_Hostware" contract="xx.ServicioDistribucion.AnalisisDatos.Interfaces.ICuentasCobrar">
          <identity>
            <dns value="localhost"/>
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://xx.143.46.82:8733/xx.ServicioDistribucion.AnalisisDatos.Servicios.CuentasCobrar/"/>
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="behaviorDistribucion">
          <serviceThrottling maxConcurrentSessions="10000"/>
          <!-- To avoid disclosing metadata information, 
          set the value below to false and remove the metadata endpoint above before deployment -->
          <serviceMetadata httpGetEnabled="True"/>
          <!-- To receive exception details in faults for debugging purposes, 
          set the value below to true.  Set to false before deployment 
          to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
<!--<dataContractSerializer maxItemsInObjectGraph="2147483646"/>-->
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <protocolMapping>
      <add binding="basicHttpsBinding" scheme="https"/>
    </protocolMapping>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true"/>
  </system.serviceModel>
</configuration>

我们正在尝试像这样使用 POSTMAN 调用服务:

这是原始的身体:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/">
   <soapenv:Header/>
   <soapenv:Body>
      <tem:ProcesarListaCuentasCobrarCIA100/>
   </soapenv:Body>
</soapenv:Envelope>

但是,我们收到了这个回复

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body>
        <s:Fault>
            <faultcode xmlns:a="http://schemas.microsoft.com/ws/2005/05/addressing/none">a:DestinationUnreachable</faultcode>
            <faultstring xml:lang="es-CO">The message with To 'http://xx.143.46.82:8733/xxServicioDistribucion.AnalisisDatos.Servicios.CuentasCobrar/ProcesarListaCuentasCobrarCIA100/' cannot be processed at the receiver, due to an AddressFilter mismatch at the EndpointDispatcher.  Check that the sender and receiver's EndpointAddresses agree.</faultstring>
        </s:Fault>
    </s:Body>
</s:Envelope>

内容类型为 text/xml。

我们正在尝试使用 POST

【问题讨论】:

【参考方案1】:

    运行您的 WCF。例如https://docs.microsoft.com/en-us/dotnet/framework/wcf/getting-started-tutorial

    打开 wsdl 并找到 Action

    您还可以在 WCF 测试客户端中找到 Action 在邮递员中 URL - 来自 wsdl - http://localhost:8000/GettingStarted/CalculatorService/

标题 -

内容类型:文本/xml

SOAPAction:http://Microsoft.ServiceModel.Samples/ICalculator/Add 4. 从 WCF 测试客户端添加正文。 对我来说身体是

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> 
  <s:Body>
    <Add xmlns="http://Microsoft.ServiceModel.Samples">
      <n1>1</n1>
      <n2>1</n2>
    </Add>
  </s:Body>
</s:Envelope>

在下拉列表中选择 - xml 发送

【讨论】:

【参考方案2】:

IIRC 当您对 WCF 服务器进行 SOAP 调用时,除了正文内容之外,还必须设置 HTTP 标头。

我的旧 SOAP 调用具有以下形式的标题:

SOAPAction: http://domain/EndPoint

您可能需要检查一下。如果您有一个正常工作的客户端,请使用 Fiddler 捕获流量。另外,我将内容类型设置为“text/xml;charset=utf-8”,我似乎记得有些服务器对 POST 上的内容类型很挑剔。

【讨论】:

SOAP UI 标头示例:POST http://server/WcfService.svc HTTP/1.1 Accept-Encoding: gzip,deflate Content-Type: text/xml;charset=UTF-8 SOAPAction: "http://tempuri.org/IServiceContract/Ping" Content-Length: 303 Host: server Connection: Keep-Alive User-Agent: Apache-HttpClient/4.1.1 (java 1.5)【参考方案3】:

我发现让 WCF 调用在 Postman 中工作的最简单方法如下...

1.) 打开 Fiddler 并在本地调试您的 WCF 项目,Visual Studio WCF 测试客户端打开。

2.) 在 WCF 测试客户端中调用您的服务方法以获取响应。

3.) 在 Fiddler 中点击请求。

4.) 点击 fiddler 中的“RAW”选项卡查看请求,并复制请求标头中的信封标签。

它应该看起来像

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"><s:Body><YourMethodName xmlns="http://yourserver.com/serviceName/v1.0"/></s:Body></s:Envelope>

5.) 在 Postman 中创建一个新请求,然后打开 BODY 选项卡,选择“原始”单选按钮。

6.) 将内容类型下拉菜单设置为“XML”。

7.) 将信封标签从上方粘贴到 Postman 的 BODY 字段中。

8.) 将 Postman 中的 URL 设置为 Fiddler 中发出的任何请求,它将是 Fiddler 中请求的第一行,类似于http://server/yourservice.svc

9.) 将 Postman 中的请求类型更改为 POST

10.) 切换到 Postman 中的 HEADERS 选项卡,添加一个 CONTENT-TYPE 标题,值为 'text/html'

11.) 在 Fiddler 请求中,您会看到一个 SOAPAction 标头,复制此标头中的 URL

12.) 在 Postman 的 HEADERS 选项卡中,添加一个“SOAPAction”标头,并将 URL 标头粘贴到此值中。

13.) 运行您的服务!

奖金

如果您想从 Postman 调用远程 WCF 服务(您无法在本地运行),请调试您的本地项目,以便打开 WCF 测试客户端。

1.) 右键单击​​ WCF 测试客户端中的“我的服务项目”树节点,然后单击“添加服务”。

2.) 输入您的服务网址

3.) 像执行本地服务一样对其调用方法,然后按照上述步骤在 Fiddler 中跟踪并添加到 Postman。

【讨论】:

【参考方案4】:

来自 wcftestlient:

    将 XML 从 XML 选项卡复制到邮递员的正文/行,类型为 XML。 确保从正文中删除标题。

    将 soapaction 添加到带有 SOAP 操作名称的标题选项卡。

【讨论】:

以上是关于如何从 POSTMAN 调用 WCF 服务方法的主要内容,如果未能解决你的问题,请参考以下文章

从 WCF 服务如何以当前用户而不是 IIS\DefaultApppool 的身份调用第三方 dll 中的方法

如何从同一 WPF 应用程序托管的 WCF 服务调用 WPF 应用程序中的方法?

如何使用命名管道从 C++ 调用 WCF 方法?

ASP.NET Web 表单 - 如何异步调用 WCF 异步方法?

如何使用 WCF 调用从客户端 windows phone 8.0 silverlight 返回对象的方法

从 WCF 服务调用异步方法