自动别名生成的SOAP代理

时间:2014-02-28 14:21:05

标签: .net soap wsdl naming-conventions svcutil.exe

我目前正在准备在.NET项目(C#)中使用SOAP web service,但是用于服务类型和操作的命名约定是非常糟糕 not与C#.NET项目典型的命名约定一致

我的问题,本质上是:有没有办法在我的客户端实现中对生成的SOAP Web服务代理类型/方法进行自动别名?

我希望有一些方法可以使用别名映射执行WSDL转换,这样生成的(或重新生成的)类型使用Contact等名称,但映射到底层{{1定义。

由于我不知道在生成过程中可以执行的任何转换,我现在正在手动(或者至少在T4的帮助下)为类编写包装器,但这似乎是不必要的级别间接;更不用说,屁股上的痛苦。

我正在阅读Svcutil上的文档,但没有找到任何适用的标记。

1 个答案:

答案 0 :(得分:4)

我已将此贴到您的other question,但您说得对,它更适合这个:

我假设您正在使用"添加服务引用..."来使用此第三方服务,该服务会自动为Reference.cs中的每个类生成一些代码,并带有签名可能看起来像这样:

[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.thirdpartyguys.net")]
public partial class qux: object, System.ComponentModel.INotifyPropertyChanged {

你希望Qux代替qux。如果到目前为止这与您的模型完全相似,那么您可以将qux更改为Qux,但将TypeName="qux"添加到XmlTypeAttribute,并在引用中更改对此类的所有引用。这样可以在SOAP中维护正确的xml架构,但是让您更改项目中的名称:

[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.thirdpartyguys.net", TypeName = "qux")]
public partial class Qux: object, System.ComponentModel.INotifyPropertyChanged {

当然,如果该类的XmlType属性尚未定义命名空间,则可以添加它。它只是没有Namespace参数。我刚刚测试了它,它确实允许我使用该服务,只需在我使用它的地方用不同的名称调用一个对象。

这对你有用吗?

编辑(向未来的读者简要介绍SchemaImporterExtension的想法) 据我所知,当从WSDL添加服务引用时,此扩展类可以调用与默认代码生成行为的偏差。您仍然最终会有一些Reference.cs充当您的项目和服务之间的链接,但您可以更改生成的内容。因此,如果我们希望对象总是以大写字母开头,我认为这个想法是做这样的事情(未经测试):

public class test : SchemaImporterExtension
{
    public override string ImportSchemaType(string name, string ns, XmlSchemaObject context,
        XmlSchemas schemas, XmlSchemaImporter importer, CodeCompileUnit compileUnit,
        CodeNamespace codeNamespace, CodeGenerationOptions options, CodeDomProvider codeGenerator)
    {
        if (name[0].CompareTo('a') >= 0) //tests if first letter is lowercase
        {
            CodeExpression typeNameValue = new CodePrimitiveExpression(name);
            CodeAttributeArgument typeNameParameter = new CodeAttributeArgument("TypeName", typeNameValue);
            CodeAttributeDeclaration xmlTypeAttribute = new CodeAttributeDeclaration("XmlTypeAttribute", typeNameParameter);
            compileUnit.AssemblyCustomAttributes.Add(xmlTypeAttribute);
            return name.Substring(0, 1).ToUpper() + name.Substring(1);
        }
        return null;
    }
}

理论上,这将写入XmlType属性并将名称更改为正确的大小写,从而在SOAP中维护正确的XML映射。理论上,使用SchemaImporterExtension的优点是对服务引用的更新不会覆盖更改。此外,可以一般性地进行更改,而不是针对每个特定的参考。

欢迎成功使用SchemaImporterExtension的人士发表评论或编辑。