我已經繼承了一段在我們公司工作了一段時間的代碼,現在我對於它到底出了什麼問題一無所知。毫不遲疑,讓我們來解決這個問題。爲什麼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的不同方式,但都基本上做同樣的事情(不奇怪)。除此之外,我還沒有找到任何有關此特定通訊的好消息,所以我只是卡住了。
是的,@約翰 - 桑德斯的回答指出了我的正確方向。看起來,我的同事實際上並沒有發送SOAP信封,這首先讓我感到困惑 - 我現在試圖將其構建並寫入HttpWebRequest。 (這是特別令人困惑的,因爲Web服務接受了正確的參數並返回了正確的值,然後再次 - 我將首先承認我遠沒有成爲這個問題的專家,血腥的繼承代碼。) – Fenixp