2014-05-11 20 views
0

我已經繼承了一段在我們公司工作了一段時間的代碼,現在我對於它到底出了什麼問題一無所知。毫不遲疑,讓我們來解決這個問題。爲什麼Web服務拒絕讀取我正在佈置的SOAP標頭?

它是如何工作

我們設置如下通信系統: 的JavaScript < -Ajax-> Web服務代理< - > Web服務 基本上,JavaScript的發送服務調用哪個,哪個方法與代理的參數,代理然後構造Http請求,然後發送到我們的Web服務之一。

什麼問題?

現在發生的新事情是我試圖將SOAP頭附加到Http請求。 Rigt現在,JavaScript代碼是無關緊要的 - 我相當確定問題在代理和Web服務之間。構建HTTP請求的代碼如下所示:

HttpWebRequest basicRequest = (HttpWebRequest)WebRequest.Create(this.url); 
basicRequest.ContentType = "application/json; charset=\"utf-8\""; 
basicRequest.Method = "POST"; 
basicRequest.AllowWriteStreamBuffering = false; 

if (Ticket != string.Empty && Ticket != null) 
{ 
    basicRequest.Headers["UserAuthenticationHeader"] = Ticket; 
} 

現在,當我致電

this.HttpResponse = (HttpWebResponse)HttpRequest.GetResponse(); 

方法之前檢查請求,調試器告訴我的頭是存在的。更確切地說,這些是Headers屬性的內容:

{Content-Type: application/json; charset="utf-8" 
UserAuthenticationHeader: user;ticket 
Host: localhost:25691 
Content-Length: 55 
Expect: 100-continue} 

現在,Web服務中恰當的方法剛剛被調用。現在,我希望這個代碼:

public class UserAuthenticationHeader : SoapHeader 
{ 
    public string Ticket { get; set; } 
} 

[WebService(Namespace = "http:*****", Description = "")] 
[System.Web.Script.Services.ScriptService] 
public class DataGetService : System.Web.Services.WebService 
{ 
    public virtual UserAuthenticationHeader UserAuthenticationHeader { get; set; } 

    [WebMethod(Description = "Gets all modules")] 
    [SoapHeader("UserAuthenticationHeader")] 
    public ModulesDS GetMetadataModules(Guid GlobalUserId) 
    { 
     Authentication.Authenticate(UserAuthenticationHeader); 

     return Sql.GetMetadataModules(GlobalUserId); 
    } 
} 

將會佔據UserAuthenticationHeader的內容的基礎上,一對夫婦MSDN文章,這將插入「UserAuthenticationHeader」的價值爲UserAuthenticationHeader屬性。但事實並非如此。當我到達這裏時,它是空的。所以,是的,我做錯了什麼?過去5個小時,我一直在努力解決這個問題,只是無法解決任何問題。我通常無法傳輸任何頭文件,我甚至試圖通過SoapUnknownHeader解析無效。

我嘗試了幾個關於如何發送肥皂標題的教程,但我大多隻寫了已經存在於應用程序中的相同代碼。我嘗試了將頭插入HttpWebRequest的不同方式,但都基本上做同樣的事情(不奇怪)。除此之外,我還沒有找到任何有關此特定通訊的好消息,所以我只是卡住了。

回答

2

同意@ john-saunders。 http://msdn.microsoft.com/en-us/library/8728chd5%28v=vs.100%29.aspx是SOAP頭文件的一個很好的例子。請注意,它們在SOAP XML有效載荷的內部序列:

<soap:Header> 
    <UserAuthenticationHeader> 
     <user>uservalue</user> 
     <ticket>tickevalue</ticket> 
    </UserAuthenticationHeader> 
</soap:Header> 

有一些工具將元素添加到使用WCF.Message或者如果您使用的是服務代理的SOAP消息。 HttpWebRequest對SOAP消息內容一無所知,因此您可以始終將XML直接注入到請求中。

+0

是的,@約翰 - 桑德斯的回答指出了我的正確方向。看起來,我的同事實際上並沒有發送SOAP信封,這首先讓我感到困惑 - 我現在試圖將其構建並寫入HttpWebRequest。 (這是特別令人困惑的,因爲Web服務接受了正確的參數並返回了正確的值,然後再次 - 我將首先承認我遠沒有成爲這個問題的專家,血腥的繼承代碼。) – Fenixp

1

SOAP標頭不駐留在HTTP標頭中。它們本身駐留在SOAP消息中。