簡體   English   中英

服務器無法識別 HTTP Header SOAPAction 的值

[英]Server did not recognize the value of HTTP Header SOAPAction

   [SoapRpcMethod(Action = "http://cyberindigo/TempWebService/InsertXML",
    RequestNamespace = "http://cyberindigo/TempWebService/Request",
    RequestElementName = "InsertXMLRequest",
    ResponseNamespace = "http://cyberindigo/TempWebService/Response",
    ResponseElementName = "InsertXMLResponse",
    Use = System.Web.Services.Description.SoapBindingUse.Literal)]

    [WebMethod]
    public string InsertXML(string Jobs)
    {
        return "Hi";
    }

當我使用 XMLHttpRequest 訪問它時出現以下錯誤服務器無法識別 HTTP 標頭 SOAPAction 的值: http://Cyber​​indigo/TempWebService/InsertXML

這篇文章下一部分的來源是:

http://bluebones.net/2003/07/server-did-not-recognize-http-header-soapaction/

(因為 OP 不想給出歸屬,感謝彼得)

請注意,bakert 是文本的原作者,而不是 OP。


在互聯網上找不到任何地方可以找到此錯誤的解釋,我想我會分享我長期搜索此錯誤的成果。

這意味着(至少在我的情況下)您正在使用 SOAP 訪問 Web 服務並在 HTTP 請求中傳遞與服務期望的不匹配的SOAPAction參數。

我陷入了困境,因為我們將 Web 服務從一台服務器移動到另一台服務器,因此我更改了調用 C# 文件中的“命名空間”(不要混淆 Web 服務命名空間和 .net 命名空間)以匹配新服務器。 但是服務器並不關心http://yournamespace.com/blah的實際網絡現實,它只關心你發送它你所說的你期望在服務器上的內容。 它不在乎那里是否真的有任何東西。

所以基本上網絡服務從http://foo.com/servicename移動到http://bar.com/servicename但網絡服務的“命名空間”保持為http://foo.com/servicename因為沒有人改變了它。

並且只用了大約 4 個小時就完成了!

如果您遇到了類似的問題,但無法解決我在這里所說的問題,請隨時通過 bakert+web@gmail.com 給我發郵件——我不希望我的四個小時花在任何人身上!

在調用 .asmx / wcf 網絡服務時,請注意以下幾點:

  1. 命名空間區分大小寫,SOAP 請求必須使用與聲明 WebService 相同的命名空間發送。

例如對於聲明如下的WebService

[WebService(Namespace = "http://MyDomain.com/TestService")] 
public class FooClass : System.Web.Services.WebService 
{
   [WebMethod]   
    public bool Foo( string name)    
     {

      ...... 
     }

 }

SOAP 請求在調用時必須為命名空間保持相同的大小寫。有時我們會忽略大小寫敏感性。

<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
     <Foo xmlns="http://MyDomain.com/TestService">
     <name>string</name>      
     </Foo>
  </soap:Body> 
</soap:Envelope>
  1. 命名空間不必與服務的托管 url 相同。命名空間可以是任何字符串。

例如,上面的服務可能托管在http://84.23.9.65/MyTestService ,但仍然在從客戶端調用 Web 服務時,命名空間應該與服務類具有的相同,即http://MyDomain.com/TestService

我同意 Sam 的觀點,即 SOAP 定義與預期不符。 這只是一種解決方案,我必須自己手動計算這個錯誤:

我的問題是我更改了 Web 方法的名稱,但沒有更改元數據標記中的“MessageName”。

[WebMethod(MessageName = "foo")]
public string bar()
{

}

它應該是

[WebMethod(MessageName = "foo")]
public string foo()
{

}

希望能幫助某人

我決定在這里發布我自己的答案,因為我在這個問題上浪費了幾個小時,我認為,雖然接受的答案非常好並為我指明了正確的方向(是的,它得到了投票),但它是不夠詳細,無法解釋我的應用程序出了什么問題,至少在我的情況下是這樣。

我在 OpenESB 2.2 中運行 BPEL 模塊,我的復合應用程序的測試用例失敗並出現以下錯誤:

Caused by: System.Web.Services.Protocols.SoapException: Server did not recognize the value of HTTP Header SOAPAction: .

在做了一些研究之后,我注意到外部 WSDL 具有解決這個問題所需的所有線索,例如,我使用以下 Web 服務通過 Web 服務的編排來驗證信用卡號: http:// www.webservicex.net/CreditCard.asmx?WSDL

如果您檢查<wsdl:operation元素,您將看到它清楚地說明了該操作的soapAction

<wsdl:binding name="CCCheckerSoap" type="tns:CCCheckerSoap">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
  <wsdl:operation name="ValidateCardNumber">
    <soap:operation soapAction="http://www.webservicex.net/ValidateCardNumber" style="document"/>
    <wsdl:input>
  <soap:body use="literal"/>
</wsdl:input>
...

但是,一旦您創建了復合應用程序並使用調用此外部 WSDL 服務的 BPEL 構建項目,出於某種原因(錯誤?),復合應用程序服務程序集 (CASA) 綁定的 XML 將使用空的soapAction參數生成:

<binding name="casaBinding1" type="ns:CCCheckerSoap">
        <soap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
        <operation name="ValidateCardNumber">
            <soap:operation soapAction="" style="document"/>
            <input>
                <soap:body use="literal"/>
            </input>

一旦您將正確的soapAction (http://www.webservicex.net/ValidateCardNumber) 復制到此參數中,應用程序的測試用例將正確並返回預期的Soap 響應。

<soap:operation soapAction="http://www.webservicex.net/ValidateCardNumber" style="document"/>

所以,這是一個更具體的解決方案,我決定根據這篇博文中的信息記錄下來: http : //bluebones.net/2003/07/server-did-not-recognize-http-header-soapaction/

這意味着(至少在我的情況下)您正在使用 SOAP 訪問 Web 服務並在 HTTP 請求中傳遞與服務期望的不匹配的 SOAPAction 參數

我有同樣的問題,經過一些檢查后解決了:

<< 目標 WebService 存在但被調用的方法不是 eXXXists。 >>

我的本地服務包含方法,但目標服務器(連接服務器)不包含指定的調用方法。

再次檢查您的程序場景...

只是為了幫助某人解決這個問題,經過一個下午的調試,問題是 Web 服務是用框架 4.5 開發的,來自 android 的調用必須用 SoapEnvelope.VER12 完成,而不是用 SoapEnvelope.VER11

我有類似的問題。 為了調試問題,我運行了Wireshark並捕獲了我的代碼生成的請求。 然后我使用XML Spy 試驗來創建一個 SOAP 請求(假設您有 WSDL)並比較這兩個請求。

這應該會給你一個提示是什么地方出了問題。

我遇到了同樣的問題,但對我來說,解決方案是我指向了錯誤的 Web 服務。 我已經正確更新了網絡參考。 但是我們將服務的 URl 存儲在加密文件中,並且我沒有使用加密的正確服務更新文件。

但所有這些建議確實幫助我意識到去哪里調試。

謝謝!

在我的 Web 服務中從“tempuri”更改命名空間后,我遇到了同樣的問題。

您必須在使用上述服務的項目中更新您的服務引用,以便它可以獲得最新的 SOAP 定義。

或者至少這對我有用。 :)

我們重命名了一些 webservice 項目命名空間,但忘記使用重命名項目的命名空間更新網站 httphandlers 配置部分。

我的錯誤由 John Saunders 先生的回答修復: http : //forums.asp.net/post/2906487.aspx

簡而言之:ws .asmx.cs 的命名空間與 ws .wsdl文件之間的區別。

1) [WebService(Namespace = "http://tempuri.org/")]

后來 Web 服務命名空間更改為:

2) [WebService(Namespace = "http://newvalue.com/")]

所以我們在 application 和 web service 中引用了 (1) 現在是 (2)。

讓他們等於解決你的問題。

我遇到了同樣的錯誤,我能夠通過刪除“Web 引用”並添加“服務引用”來解決它

當我嘗試調用不存在的方法時出現此錯誤。 它只存在於我們的網絡服務的較新版本中。

我有同樣的錯誤消息的類似問題:

System.Web.Services.Protocols.SoapException:服務器無法識別 HTTP Header SOAPAction的值:

我們在 Web 服務調用中使用動態 URL。 我們有一個中央配置服務器來管理所有 Web 服務調用的位置,以便我們的代碼可以在 DEV 中運行、測試或實時運行而無需重新編譯。 在我們的配置服務器中,用於測試環境的特定 Web 服務調用的 URL 不正確。 Web 服務調用被發送到錯誤的服務器和錯誤的 Web 服務。

因此,此錯誤可能只是 Web 服務請求與被調用的 Web 服務不匹配的結果。

在 Web App 服務器上運行 fiddler 才發現實際調用的是不正確的 Web 服務。

問題出在服務中的 System.Web.Services.Protocols.SoapDocumentMethodAttribute 中。 請檢查一下。 它可能會改變。

我發現我的 Web 引用已過期,並且代碼正在調用已刪除的 Web 服務。

我不得不整理我的服務引用的大小寫,刪除引用並重新添加它們來解決這個問題。 我不確定這些步驟中是否有任何一個是迷信的,但問題就解決了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM