如何从POSTMAN调用WCF服务方法

时间:2016-01-29 19:55:33

标签: c# wcf rest soap postman

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

这是配置。

func resizeImage(image: UIImage, newHeight: CGFloat) -> UIImage {
    let scale = newHeight / image.size.height
    let newWidth = image.size.width * scale
    UIGraphicsBeginImageContext(CGSizeMake(newWidth, newHeight))
    image.drawInRect(CGRectMake(0, 0, newWidth, newHeight))
    let newImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return newImage
} 

我们正试图用POSTMAN调用这个服务:

这是原始身体:

<?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>

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

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

内容类型heaer是text / xml。

我们正在尝试使用POST

4 个答案:

答案 0 :(得分:6)

  1. 运行WCF。例如https://docs.microsoft.com/en-us/dotnet/framework/wcf/getting-started-tutorial enter image description here

  2. 打开wsdl并找到操作 enter image description here

  3. 您还可以在WCF测试客户端中找到Action enter image description here enter image description here
  4. 在邮递员中 网址-来自wsdl-http://localhost:8000/GettingStarted/CalculatorService/

标题-

内容类型:text / xml

SOAPAction:http://Microsoft.ServiceModel.Samples/ICalculator/Add enter image description here 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 enter image description here 发送 enter image description here

答案 1 :(得分:4)

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

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

SOAPAction: http://domain/EndPoint

您可能需要检查一下。如果您有一个有效的客户端,请使用Fiddler捕获流量。另外,我将内容类型设置为&#34; text / xml;字符集= UTF-8&#34;我似乎记得有些服务器对POST上的内容类型很挑剔。

答案 2 :(得分:1)

我发现让Postman中的WCF呼叫最简单的方法如下...

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

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

3。)单击Fiddler中的请求。

4。)单击提琴手中的“ 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中创建一个新请求,然后打开“身体”选项卡,选择“原始”单选按钮。

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 Test Client中的“我的服务项目”树节点,然后单击“添加服务”。

2。)输入您的服务网址

3。)就像执行本地服务一样在其上调用一个方法,然后按照上面的步骤跟踪Fiddler并将其添加到Postman。

答案 3 :(得分:0)

来自wcftestlient:

  1. 使用XML类型将XML从XML选项卡复制到邮递员的身体/行。 确保从正文中删除标题。

  2. 使用SOAP操作名称将soapaction添加到标题选项卡。