【问题标题】:How do you replace the naming convention for ServiceContract and OperationContract?如何替换 ServiceContract 和 OperationContract 的命名约定?
【发布时间】:2014-03-07 15:54:50
【问题描述】:

我有以下代码:

[ServiceContract(Name = "Save{0}")]
public ISave<T> where T : BusinessObject
{
    [OperationContract(Name = "Save")]
    void Save(T obj);
}

public class SaveCustomer : ISave<Customer>
{
    public void Save(Customer obj) { ... }
}

我遇到的问题是我使用 IIS/WAS 的 WCF 应用程序不喜欢我给的名称。它不会自动填充它。我看到了这个stackoverflow question,它有关于为什么名称不会自动格式化的答案。我没有等待 Microsoft 允许格式化名称,而是看看是否可以用我自己的名称替换获取名称的功能。

我只是不确定我需要扩展哪个类(ServiceHostServiceHostFactoryDataContractSerializer 等),甚至不确定我必须重写什么方法才能获得更友好的名称。另外,由于我什至不知道我必须创建什么类,所以我不知道在哪里可以告诉我的应用程序使用它(Global.asax 成员?svc 文件?属性?)。

【问题讨论】:

    标签: c# asp.net wcf generics datacontract


    【解决方案1】:

    答案似乎是这并不是真正需要的。似乎服务名称是按约定创建的。如果您相应地更改代码:

    [ServiceContract] // No use of the 'Name' property
    public ISave<T> where T : BusinessObject
    {
        [OperationContract(Name="Save")]
        void Save(T obj);
    }
    
    public class SaveCustomer : ISave<Customer>
    {
        public void Save(Customer obj) { /* Do stuff here */ }
    }
    

    那么生成的配置应该类似于web.config 文件中的以下内容(假设为basicHttpBinding):

    <service name="SaveCustomer">
        <endpoint
            address="http://localhost:8001/SaveCustomer/"
            binding="basicHttpBinding"
            contract="ISave`1[[FullyQualifiedNamespaceTo.Customer, AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=....]]"
        />
    </service>
    

    我在接受答案的 cmets 中找到了这个 here。显然,您需要提供自己的程序集名称、版本、文化和 PublicKeyToken。如果您没有 PublicKeyToken,我相信您可以不使用它。

    因此,似乎通过在ISave&lt;T&gt; 接口上声明ServiceContractAttribute,然后在名为SaveCustomer 的类中实现该接口会产生一个名为SaveCustomer 的服务(我相信这是你所追求的) .尽管在 web.config 文件中指定时,您可能不得不摆弄用于泛型类型的语法。

    所以,如果你有另一个服务类,例如:

    public class SaveOrder : ISave<Order>
    {
        public void Save(Order obj) { /* Do stuff here */ }
    }
    

    那么你应该得到另一个服务端点配置:

    <service name="SaveOrder">
        <endpoint
            address="http://localhost:8001/SaveOrder/"
            binding="basicHttpBinding"
            contract="ISave`1[[FullyQualifiedNamespaceTo.Order, AssemblyName, Version=1.0.0.0, Culture=neutral, PublicKeyToken=....]]"
        />
    </service>
    

    HTH。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      相关资源
      最近更新 更多