根据环境

时间:2016-06-03 14:02:10

标签: c# web-services

我写的代码是与第三方Web服务集成。问题是服务的soap操作在测试和生产环境中有所不同,虽然这个URI不重要,但是如果soap操作URI错误,则主机返回400 - 错误的请求错误。 主机服务是用Java编写的。我们正在使用C#Web服务代理。

Reference.cs

/// <remarks/>
        [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://1.1.1.1:9080/wss/Ping", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        [return: System.Xml.Serialization.XmlElementAttribute("PingResp", Namespace="http://namespace/data")]
        public PingResp Ping([System.Xml.Serialization.XmlElementAttribute("PingReq", Namespace="http://namespace/data")] PingReq PingReq) {
            object[] results = this.Invoke("Ping", new object[] {
                        PingReq});
            return ((PingResp)(results[0]));
        }

对于生产环境,SoapAction是:

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://2.2.2.2:9080/wss/Ping", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]

有没有办法使这个动态,即是否可以根据配置设置更改soap动作URI?

我尝试过延长SoapDocumentMethodAttribute课程,但是已经密封了。

1 个答案:

答案 0 :(得分:2)

由于它需要一个编译时常量,我们必须在编译之前设置这个值,以便根据环境使用它并使用类似ConfigurationManager的东西是不可能的。

您可以使用#if预处理器填充的const属性创建一个全局静态类,并在构建时指定条件编译符号。

   public static class GlobalConstants
    {
#if DEBUG
        public const string Uri = "devUri";
#endif
#if TEST
        public const string Uri = "testUri";
#endif
#if RELEASE
        public const string Uri = "releaseUri";
#endif

    }

你可以像

一样使用它
[System.Web.Services.Protocols.SoapDocumentMethodAttribute(GlobalConstants.Uri, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]

这会在迁移到新环境时增加复杂性,但这是一种让您接近所需内容的方法。

有关在构建时指定编译符号的文档:https://msdn.microsoft.com/en-us/library/0feaad6z.aspx