WCF - 向Silverlight和JQuery客户端公开服务

时间:2010-01-14 15:20:47

标签: jquery wcf silverlight

我有一个使用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;
    }
}

谢谢!

1 个答案:

答案 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)。但是采用这种方法可能比使用这种方法更有价值,结果可能不太可维护。