我正在使用一個外部的SOAP服務,即歐洲國家藥品核查系統,我對它沒有控制權。 我的應用程式使用一個從提供的WSDL中自動生成的WCF客戶端。 該客戶端使用System.ServiceModel.Channels.Message.
。SOAP服務對G482LoadTermsAndConditions和G487LoadDataPrivacyPolicies這兩條訊息使用相同的訊息結構,即 "I7RequestType",并且不 "理解 "任何行動頭。
這是我的請求資訊,其中忽略了Action頭:
這是我的請求資訊,其中忽略了Action頭。
<?xml version="1.0"/span> encoding="UTF-8"/span>?
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="0">ns:G482RequestMessage</a:Action>
</s:Header>
<s:Body xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<I7RequestType xmlns="urn:wsdltypes.nmvs.eu:v4.0"/span>>。
<Header xmlns="urn:types.nmvs.eu:v4.0">
<Auth>
<ClientLoginId>XXXX</ClientLoginId>
<UserId>XXXX</UserId>
<Password>xxxxx</Password>
</Auth>
<UserSoftware xmlns:d5p1="urn:types.nmvs.eu:v4. 0" d5p1:name="xxxx" d5p1:supplier="xxxx" d5p1:version="2.0" />
<交易>
<ClientTrxId>xxxxxxxxxxxxxx</ClientTrxId>
<Language>fra</Language>
</Transaction>
</Header>
</I7RequestType>
</s:Body>
</s:Envelope>
服務器忽略了Header Action,如果mustUnderstand被設定為1,則回傳一個故障。
顯然,我應該使用HTML內容型別來允許服務器區分這兩種資訊。 這是我得到的例子:
我應該使用HTML內容型別來允許服務器區分這兩種資訊。
Content-Type : application/soap xml;charset=utf-8; method=SUPPORT-I7RequestType;action="urn:G482LoadTermsAndConditions";
我的自定義 MessageInspector 可以在 BeforeSendRequest() 中操作訊息內容,但我找不到任何添加/修改封裝的 HTTP 訊息頭的方法。
有誰知道有什么方法可以修改出站的 System.ServiceModel.Channels.Message 的 HTTP 頭資訊?
提前感謝。 uj5u.com熱心網友回復: 經過多次搜索,問題似乎是由于生成的WCF客戶端沒有遵守WSDL和SOAP 1.2規范。
這個答案帶有wsHttpBinding的WCF服務--操縱HTTP請求頭給了我創建一個變通方法所需的全部內容。 這是我在CustomMessageInspector(實作了IEndpointBehavior和IClientMessageInspector)的BeforeSendRequest()函式中加入的硬編碼的概念驗證代碼,它在很大程度上基于Dejan Janju?evi?的回復。
標籤: //確保我們有一個HttpRequestMessageProperty。
HttpRequestMessageProperty httpRequestMessageProperty;
if( request.Properties.ContainsKey( HttpRequestMessageProperty.Name ) )
{
httpRequestMessageProperty = request.Properties[HttpRequestMessageProperty.Name] as HttpRequestMessageProperty;
if( httpRequestMessageProperty == null )
{
httpRequestMessageProperty = new HttpRequestMessageProperty()。
request.Properties.Add( HttpRequestMessageProperty.Name, httpRequestMessageProperty ) 。
}
}
else[/span
{
httpRequestMessageProperty = new HttpRequestMessageProperty()。
request.Properties.Add( HttpRequestMessageProperty.Name, httpRequestMessageProperty ) 。
}
Console.WriteLine("原始請求:")。
Console.WriteLine("{0}.
", request)。)
request.Headers.Clear()。
httpRequestMessageProperty.Headers.Add( "Content-Type", "application/soap xml; charset=utf-8; method=SUPPORT-I7RequestType; action="urn:G482LoadTermsAndConditions"" )。
