如何替换ServiceContract和OperationContract的命名约定?

时间:2014-03-07 15:54:51

标签: c# asp.net wcf generics datacontract

我有以下代码:

[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文件?属性?)。

1 个答案:

答案 0 :(得分: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>

我在对已接受答案的评论中发现了here。显然,您需要提供自己的程序集名称,版本,文化和PublicKeyToken。如果您没有PublicKeyToken,我相信您可以将其关闭。

因此,似乎通过在ServiceContractAttribute接口上声明ISave<T>,然后在名为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。