mic*_*ael 6 c# asp.net generics wcf 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) { ... }
}
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是我使用IIS/WAS的WCF应用程序不喜欢我给的名字.它不会自动填充它.我看到了这个stackoverflow问题,它有关于为什么名称不会自动格式化的答案.我没有等待微软允许格式化名称,而是看到我是否可以用我自己的名称替换名称的功能.
我只是不确定我需要扩展(哪一类ServiceHost,ServiceHostFactory,DataContractSerializer等),甚至什么方法我要重写,以获得更友好的名称.另外,因为我甚至不知道我要创建什么类,我不知道在哪里可以告诉我的应用程序使用它(Global.asax成员?svc文件?属性?).
答案似乎是,这并不是真正需要的。服务名称似乎是按约定创建的。如果您相应地更改代码:
[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 */ }
}
Run Code Online (Sandbox Code Playgroud)
那么生成的配置应类似于文件中的以下内容web.config(假设 a 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>
Run Code Online (Sandbox Code Playgroud)
我在已接受答案的评论中找到了这一点。显然,您需要提供自己的程序集名称、版本、区域性和 PublicKeyToken。如果您没有 PublicKeyToken,我相信您可以不使用它。
因此,看来通过ServiceContractAttribute在您的ISave<T>接口上声明 ,然后在名为 的类中实现该接口SaveCustomer会产生一个名为 的服务SaveCustomer(我相信这就是您所追求的)。尽管在文件中指定时,您可能需要摆弄用于泛型类型的语法web.config。
因此,如果您有另一个服务类别,例如:
public class SaveOrder : ISave<Order>
{
public void Save(Order obj) { /* Do stuff here */ }
}
Run Code Online (Sandbox Code Playgroud)
那么你最终应该得到另一个服务端点配置:
<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>
Run Code Online (Sandbox Code Playgroud)
HTH。
| 归档时间: |
|
| 查看次数: |
262 次 |
| 最近记录: |