将其他信息从SoapExtension传递到WebMethod实现

时间:2012-11-16 10:05:24

标签: c# .net web-services

由于我们软件的网络架构,我们的应用服务器无法直接连接到客户的Web服务。因此,我们在应用程序服务器和客户服务器之间有一个集成服务器。此集成服务器托管代理Web服务。问题是需要的凭据和一些其他附加信息需要从我们的应用服务器的数据库传递到集成服务器上的代理Web服务。

我不想污染API并传递包含有关每个Web服务请求的凭据和其他信息的对象。此外,我们有多个集成服务器可以随意关闭,因此我不能仅使用凭据和其他信息在单独的方法中初始化Web服务,因为后续的Web服务请求可能会传递给另一个集成服务器。

有没有办法添加某种SoapExtension,可用于在每种方法上将信息传递给我的Web服务实例?如果没有,除了为每个Web方法添加一个参数并使用它来传递信息之外,还有什么我可以做的吗?

1 个答案:

答案 0 :(得分:1)

答案实际上很明显。

首先,我需要创建一个派生自SoapHeader的类。此类用于存储所有凭据和其他附加信息。为了便于解释,我们给这个类命名为CredentialContainer。

在实际的Web服务类中,我们需要添加一个CredentialContainer类型的新公共属性。此示例中的属性名为Container。

最后,我们必须使用WebMethod属性为每个方法添加名为SoapHeader的新属性。这会处理将SOAP消息头中传递的信息传递给CredentialContainer实例。因为为每个Web服务请求创建了新的Web服务实例,所以即使有多个并发Web服务请求也没有风险。

以下是示例代码:

[WebService]
public class ExampleWebService
{
    public CredentialContainer Container { get; set; }

    [WebMethod]
    [SoapHeader("Container")]
    public void PerformSomething(string value)
    {
        var actualWebServiceClient = new MyWebServiceClient(Container.Url, ...);
        actualWebServiceClient.SendValue(value);
    }
}

public class CredentialContainer : SoapHeader
{
    public string Url { get; set; }
    ...
}