C# 将附加信息从SoapExtension传递到WebMethod实现

C# 将附加信息从SoapExtension传递到WebMethod实现,c#,.net,web-services,C#,.net,Web Services,由于我们软件的网络架构,我们的应用服务器无法直接连接到客户的web服务。因此,我们在应用服务器和客户服务器之间有一个集成服务器。此集成服务器承载代理web服务。问题在于,必需的凭证和一些其他附加信息需要从应用服务器上的数据库传递到集成服务器上的代理web服务 我不想污染API并传递包含每个web服务请求的凭据和附加信息的对象。此外,我们有多个可以随意关闭的集成服务器,因此我不能在单独的方法中使用凭据和其他信息初始化web服务,因为后续的web服务请求可能会传递到另一个集成服务器 是否有一种方法可

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

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


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

答案其实很明显

首先,我需要创建一个从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; }
    ...
}

答案其实很明显

首先,我需要创建一个从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; }
    ...
}