从.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以识别它。由于这与业务逻辑无关,我们可以将其添加到元数据信息中吗...比如标题。
答案 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中声明它,你就完成了。