繁体   English   中英

如何将其他数据传递到Web服务

[英]How to pass additional data to a Web Service

从.NET(C#)代码,我们正在调用Java Web服务。 它是一个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 Web服务请求成功处理后,我们将记录使用情况信息以及请求的来源(来自webappln / windows appln / flex客户端)。

我们希望客户发送其唯一ID进行标识。 由于这与业务逻辑无关,因此我们可以在表头中添加元数据信息吗?

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

通常有手工操作SOAP消息的方法,但如果可能的话,我可能会避开它,因为手工编辑SOAP消息与使用序列化驱动框架的观点背道而驰。 就是说,如果您无法控制服务方法,并且控制它的组需要您将其他数据传递到soap对象之外,那么您可能会被手工弄乱SOAP消息。

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

可以使用SOAP标头,但由于标头没有任何商业意义,因此我不愿采用这种方法。 而是更改签名并使用请求和响应对象。

SearchByEIDResponse GetEmpInfo.EmpProxyService.searchByEID(SearchByEIDRequest)

这样可以减少任何更改,避免大量参数列表。

您如何将信息传递到Web服务取决于Web服务公开的方法。 服务以何种语言编写,对于您来说,消费者是无关紧要的。 如果Java Web服务需要一个名称值对来检索某些数据,则方法签名将公开这些数据。

objEmp.searchByEID(strEID, strVal1, strVal2);

就是说,作为Eben表示 ,最好使用请求和响应对象来使参数列表简短。 何时使用这些更复杂的类型是有经验的,即如果只需要传递单个字符串值,则不要从一开始就使用请求对象,而如果需要传递50个字符串值,请使用请求对象。

如果您有多个Web服务,并且不想更改所有方法(这是合理的),则可以使用SoapExtension以http://msdn.microsoft.com/zh-cn/library/system.web.services.protocols .soapextension.aspx您在客户端上编写了肥皂扩展类,然后在web.config中对其进行了声明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM