我有以下代码:
[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允许格式化名称,而是看到我是否可以用我自己的名称替换名称的功能。
我只是不确定我需要扩展哪个类(ServiceHost
,ServiceHostFactory
,DataContractSerializer
等等,或者甚至我必须覆盖哪种方法来获取一个更友好的名字。另外,由于我甚至不知道我要创建什么类,我不知道在哪里可以告诉我的应用程序使用它(Global.asax成员?svc文件?属性?)。
答案 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。