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を使おうとしています
IIRCでWCFサーバーにSOAP呼び出しを行う場合、本文のコンテンツに加えて設定する必要のあるHTTPヘッダーがあります。
私の古いSOAP呼び出しには、次の形式のヘッダーがあります。
SOAPAction: http://domain/EndPoint
これを確認する必要があるかもしれません。動作しているクライアントがある場合は、Fiddlerでトラフィックをキャプチャします。また、content-typeを "text/xml; charset = utf-8"に設定していて、POSTのコンテンツタイプに気を使っているサーバーがあることを思い出しているようです。
PostmanでWCF呼び出しを機能させる最も簡単な方法は次のとおりです...
1.)Fiddlerを開き、WCFプロジェクトをローカルでデバッグすると、Visual StudioWCFテストクライアントが開きます。
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で新しいリクエストを作成し、[BODY]タブを開いて、[raw]ラジオボタンを選択します。
6.)コンテンツタイプのドロップダウンを「XML」に設定します。
7.)封筒タグを上からPostmanのBODYフィールドに貼り付けます。
8.)PostmanのURLを、Fiddlerで行われているリクエストに設定します。これは、Fiddlerのリクエストの最初の行になります。 http://server/yourservice.svc
9.)PostmanのリクエストタイプをPOSTに変更します
10.)Postmanの[HEADERS]タブに切り替え、値が「text/html」のCONTENT-TYPEヘッダーを追加します。
11.)Fiddlerリクエストで、SOAPActionヘッダーが表示されます。このヘッダーのURLをコピーしてください
12.)Postmanの[HEADERS]タブで、「SOAPAction」ヘッダーを追加し、URLヘッダーをこの値に貼り付けます。
13.)サービスを実行してください!
ボーナス
PostmanからリモートWCFサービス(ローカルで実行できない)を呼び出す場合は、ローカルプロジェクトをデバッグして、WCFテストクライアントを開きます。
1.)WCFテストクライアントの[マイサービスプロジェクト]ツリーノードを右クリックし、[サービスの追加]をクリックします。
2.)サービスのURLを入力します
3.)ローカルサービスを実行する場合と同じようにメソッドを呼び出し、Fiddlerで追跡し、上記の手順に従ってPostmanに追加します。
WCFを実行します。例 https://docs.Microsoft.com/en-us/dotnet/framework/wcf/getting-started-tutorial
ヘッダー-
コンテンツタイプ:text/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>