我有一个使用WCF的Web服务。此Web服务有一个方法,我希望可以从两种不同类型的客户端访问。第一种类型的客户端是Silverlight应用程序。第二种类型的客户端是依赖于JQuery的AJAX应用程序。是否可以编写一次方法,以便两种类型的客户端都可以访问Web服务?如果是这样,怎么样?这是我到目前为止的代码:
[ServiceContract(Namespace = "")]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class myService
{
[OperationContract]
public List<string> SearchByName(string name)
{
List<string> results = new List<string>();
results.Add("Bill");
results.Add("John");
// more retrieved through database hit.
return results;
}
}
谢谢!
答案 0 :(得分:1)
如果我是你,我将使用两个不同的接口 - 一个用于Silverlight(传统WS通信),另一个用于jQuery / JSON。
然后,服务类(在您的情况下为myService)将实现两个接口。示例:
[ServiceContract(Namespace="urn:Cheeso.Samples" )]
public interface IJsonService
{
[OperationContract]
[WebInvoke(Method = "GET",
RequestFormat=WebMessageFormat.Json,
ResponseFormat = WebMessageFormat.Json,
UriTemplate = "search/{name}")]
List<String> JsonSearchByName(String name);
}
[ServiceContract(Namespace="urn:Cheeso.Samples" )]
public interface IWsService
{
[OperationContract(Name="SearchByName")]
List<String> WsSearchByName(String name);
}
[ServiceBehavior(Name="MultiFacedService",
Namespace="urn:Cheeso.Samples")]
public class myService : IJsonService, IWsService
{
public List<String> JsonSearchByName(String name)
{ return SearchByName_Impl(name); }
public List<String> WsSearchByName(String name)
{ return SearchByName_Impl(name); }
public List<String> SearchByName_Impl(String name)
{
var results = List<string>();
// fill results here...
return results;
}
}
我发现你没有指定一个显式的C#接口来保存可远程访问的方法。考虑这样做,正如我在上面的代码中所示。当您的WCF设计变得更复杂时,它会有所帮助。
可以只编写一组方法,然后使用自定义ServiceHost将接口公开为Json和WS(See example)。但是采用这种方法可能比使用这种方法更有价值,结果可能不太可维护。