2011-04-26 55 views
0

從.NET(C#)代碼中,我們調用Java Web服務。 它是一個SAOP請求。 Java Web服務是使用Axis 1.4開發的。如何將附加數據傳遞給Web服務

下面是示例代碼,使Java Web服務請求:

private string GetUserInfo(string strEID) 
{ 
    string strEmpData = string.Empty; 
    GetEmpInfo.EmpProxyService objEmp;   

    try 
    { 
    objEmp = new GetEmpInfo.EmpProxyService(); 
    strEmpData = objEmp.searchByEID(strEID); 
    } 
    catch (WebException ex) 
    { 

    } 

    objEmp.Dispose(); 
    return strEmpData; 
} 

現在,我們有需要傳遞一些附加信息的變更請求 - 一個NAME_VALUE對給java web服務。

我們該如何做到這一點?

我可以通過HTTP/SOAP頭中的信息嗎?

更改方法簽名並添加額外的信息來傳遞信息並不是我想的好主意。

編輯:它基本上我們想添加誰是所有消費Web服務的日誌記錄inforamtion。一旦成功處理了java web服務請求,我們將記錄使用信息以及請求的來源(來自webappln/windows appln/flex client)。

我們希望客戶發送其唯一的ID來識別它。由於這與業務邏輯無關,我們可以在頭文件中添加元數據信息。

+0

您是否擁有對Web服務簽名的控制權,還是您堅持使用的第三方服務? – 2011-04-26 05:18:38

+0

@安迪是的,我們確實可以控制代碼 - .NET和Java。但是由於有很多這樣的服務,我們正計劃在java端編寫AOP/Servlet_Filter來處理這些額外的數據。 – HanuAthena 2011-04-26 05:20:58

回答

0

可以使用SOAP標頭,但我寧願不去那條路由,因爲標頭沒有商業意義。而是改變簽名並使用請求和響應對象。

SearchByEIDResponse GetEmpInfo.EmpProxyService.searchByEID(SearchByEIDRequest)

THS進行任何更改少不好受,防止巨大的參數列表。

0

如何將信息傳遞給Web服務取決於Web服務公開的方法。用戶使用什麼語言編寫服務對您而言是無關緊要的。如果Java Web服務需要一個名稱值對來檢索某些數據,而方法簽名將公開該數據。

objEmp.searchByEID(strEID, strVal1, strVal2); 

這就是說你作爲Eben indicates你最好使用request和response對象,讓您的參數列表短。何時使用這些更復雜的類型帶有經驗,即如果您只需傳遞單個字符串值,則不要使用get go中的請求對象,但如果您需要傳遞50個字符串值,請使用請求對象。

1

如果您可以控制服務簽名,我會建議您更改此Web服務的簽名,或者添加另一個接受附加參數的方法。當你使用像C#或Java這樣的高級語言時,Web服務框架傾向於將整個SOAP堆棧從你身上抽象出來,並且讓你只處理最終被序列化的普通對象來創建方法呼叫。只有參數對象暴露出來,如果它不是實際方法簽名的一部分,那麼嘗試向SOAP消息中注入更多內容可能會非常棘手。

通常有手動操作SOAP消息的方法,但如果可能的話,我可能會避開這種方式,因爲手動編輯SOAP消息違背了使用序列化驅動框架的要點。也就是說,如果您無法控制服務方法,並且控制它的組需要您將其他數據傳遞到soap對象之外,那麼您可能會被手工搞亂SOAP消息。

如果你想添加一些未來的校樣到你的服務,我會建議傳遞一個完整的對象而不是單個字符串或原始值。在你的對象中,你可以包含一個像HashMap或Dictionary這樣的鍵值數據存儲,這樣可以在不改變Web服務的簽名或模式的情況下傳遞額外的數據。使用鍵值數據,文檔變得非常重要,因爲它不再明確指定數據類型或參數。

相關問題