2011-04-26 82 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服务的签名或模式的情况下传递额外的数据。使用键值数据,文档变得非常重要,因为它不再明确指定数据类型或参数。

相关问题