如何将其他数据传递给Web Service

时间:2011-04-26 05:13:20

标签: c# java .net web-services

从.NET(C#)代码开始,我们正在调用Java Web Service。 这是一个SAOP请求。 Java WebServices是使用Axis 1.4开发的。

以下是发出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 webservice。

我们如何实现这一目标?

我可以在HTTP / SOAP标头中传递信息吗?

更改方法签名并添加其他信息以传递信息,我猜想这不是一个好主意。

编辑:基本上我们想要添加谁都在使用Web服务的日志记录信息。成功处理java webservice请求后,我们将记录使用信息以及请求源(来自webappln / windows appln / flex客户端)。

我们希望客户端发送其唯一ID以识别它。由于这与业务逻辑无关,我们可以将其添加到元数据信息中吗...比如标题。

4 个答案:

答案 0 :(得分:1)

如果您可以控制服务签名,我实际上建议您更改此Web服务的签名,或者添加另一个带有其他参数的方法。当您使用C#或Java等高级语言时,Web服务框架倾向于将整个SOAP堆栈从您身上抽象出来,并让您只处理最终被序列化以生成方法的普通对象呼叫。只有暴露了参数对象,如果它不是实际方法签名的一部分,尝试将其他内容注入SOAP消息可能会很棘手。

通常有一些方法可以手动操作SOAP消息,但如果可能的话,我可能会回避这一点,因为手动编辑SOAP消息与使用序列化驱动的框架相反。也就是说,如果您无法控制服务方法,并且控制它的组需要您在soap对象之外传递其他数据,那么您可能会手动弄乱SOAP消息。

如果您想为您的服务添加一些未来的校对,我建议传递一个完整的对象而不是单个字符串或原始值。在您的对象中,您可以包含键值数据存储(如HashMap或Dictionary),以便可以在不更改Web服务的签名或架构的情况下传递其他数据。使用键值数据,文档变得很重要,因为它不再是明确指定的数据类型或参数。

答案 1 :(得分:0)

可以使用SOAP标头,但我宁愿不去那条路线,因为标头没有商业含义。而是更改签名并使用请求和响应对象。

SearchByEIDResponse GetEmpInfo.EmpProxyService.searchByEID(SearchByEIDRequest)

这使得任何变化都不那么痛苦,并且会阻止大量的参数列表。

答案 2 :(得分:0)

如何将信息传递给Web服务取决于Web服务公开的方法。作为消费者,您所使用的服务语言对您来说无关紧要。如果Java Web服务需要一个名称值对来检索某些数据,那么方法签名将公开该数据。

objEmp.searchByEID(strEID, strVal1, strVal2);

那说你Eben indicates你最好使用请求和响应对象来保持你的参数列表简短。何时使用这些更复杂的类型带来经验,即如果您只需要传递单个字符串值,则不要使用get go中的请求对象,但如果需要传递50个字符串值,则使用请求对象。

答案 3 :(得分:0)

如果你有多个web服务并且不想改变所有方法(这是合理的),那么可以使用SoapExtension http://msdn.microsoft.com/en-us/library/system.web.services.protocols.soapextension.aspx 你在客户端编写你的soap扩展类,在web.config中声明它,你就完成了。