1

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

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

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

4

1 回答 1

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; }
    ...
}
于 2012-11-16T12:53:21.217 回答