我写的代码是与第三方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
课程,但是已经密封了。
答案 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