更改命名空间的System.ServiceModel.MessageContractAttribute

时间:2019-04-05 09:56:45

标签: c# wcf xsd

我公司的不同计算机上运行着许多服务。这些服务公开了可以使用WCF连接到的SOAP端点。

我可以将服务的引用导出为cs文件。 那里的课程看起来像这样:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.MessageContractAttribute(WrapperName="abc_cfg_keyResponse", WrapperNamespace="http://abc/xsd", IsWrapped=true)]
public partial class abc_cfg_keyResponse
{

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://abc/xsd", Order=0)]
    public System.Nullable<int> x_id;
}

在众多服务器上,“ abc”取决于如何启动linux服务。 取决于管理该服务器的人员以及他们对大写,小写和命名的总体感觉,名称空间的URI可以是“ http://abc/xsd”,“ http://ABC/xsd”或其他任何东西。 服务器上运行着多种服务,这意味着“ http://def/xsd”可能属于也可能不属于同一服务。

MessageBodyMemberAttribute给出静态编译时类型信息。 名称空间属性必须是有效的URI。

我的问题是我只能为一台目标服务器构建服务。我要构建的内容必须与许多服务器兼容。

我试图在decorating属性中创建Namespace的运行时交换。这将允许迭代可能的候选对象,直到找到匹配为止。这对我不起作用,因为我无法在运行时更新属性。

我尝试将URI更改为通配符URI,并让服务器确定xsd。原则上,类名称在没有名称空间的情况下将是唯一的,这意味着可以保证动态匹配以找到正确的名称空间。 可悲的是,“ http:// * / xsd”不是此技术的有效URI,它会创建运行时异常。

如果能为服务器生成一个正则表达式来查找名称空间,我将非常高兴。就我而言,这个\w*[aA][bB][cC]\w*会让我步入正轨,但鉴于不支持通配符uri,我认为我很不走运。

完全允许abcABC可以覆盖将近100%的用例。

我可以使用装饰属性做些什么,以使名称不同的命名空间对同一对象有效?

This感觉很相关,但可以使用我没有的文档类型。

0 个答案:

没有答案