2009-06-01 52 views
2

我想为我的客户创建一个Web服务,以便他们可以在自己的网站上显示他们的数据。由于我不知道每个客户端在运行什么平台,因此创建WCF服务的代理可以被所有浏览器使用的最佳解决方案是什么?另外,我不确定我应该如何呈现数据。假设我的用户没有任何开发技能。我将通过其他一些界面让用户能够下载创建请求所需的代码,然后处理响应。在客户端解析xml响应,然后创建数据列表还是让列表已经格式化(以字符串形式)并让客户端执行document.write?会更好吗?我已经看了几个解决方案,但他们似乎需要使用带有脚本管理器的ASP页面。就像我说过的,我想要一些足够通用的东西来使用不同的浏览器。主要是IE和FireFox。使用JavaScript消费WCF,但保持通用的所有客户端?

丹尼尔

回答

4

首先,因为你不希望依赖于微软的Ajax的ScriptManager,不要在endpointBehaviors /行为使用< enableWebScript/>。它是特定于Microsoft的JSON。

然而幸运的是,WCF让您的客户端很容易决定他们是否需要XML或泛型JSON。

  1. 使用< webHttp/>行为。

    <endpointBehaviors>
    <行为名称= “My.WcfServices.webHttpBehavior” >
    < webHttp/>
    < /行为>
    </endpointBehaviors >

  2. 按照 Damian Mehers' blog, WCF REST Services中所述创建自定义WebServiceHost和自定义属性属性。在Mehers的代码中,类型由请求内容类型决定。您可能想要扩展它以检查URL,例如.xml或.json或?format = xml | json。

  3. SerializeReply方法中,检查URL。

    消息请求= OperationContext.Current.RequestContext.RequestMessage;
    Uri url = request.Properties [“OriginalHttpRequestUri”]作为Uri;
    //检查格式查询字符串
    System.Collections.Specialized.NameValueCollection colQuery = System.Web.HttpUtility.ParseQueryString(url.Query);
    string strResponseFormat = colQuery [“format”];
    //或检查扩展
    string strResponseFormat = url.LocalPath.Contains(“。json”)?“json”:“xml”;

  4. 定义您的方法(或多个)

    [OperationContract的]
    [WebGet(UriTemplate = “你好。{responseFormat}”)] //或 “喂?格式= {responseFormat}”
    [ DynamicResponseType]
    public string Hello(string responseFormat)
    {
    return“Hello World”;
    }

实施例的URL:
http://localhost/myrest.svc/Hello.xml
http://localhost/myrest.svc/Hello.json

http://localhost/myrest.svc/Hello?format=xml
http://localhost/myrest.svc/Hello?format=json

  • 两个JSON和XML很容易跨浏览器消耗。库,如JSON for JSON和Sarissa for XML使它更加容易。
  • 注:如果您看到错误“无法找到与绑定的WebHttpBinding端点符合计划http的基址。”中,添加baseAddressPrefixFilters元素,并添加本地主机(或任何你域)以IIS主机标题名称。

    <system.serviceModel> 
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"> 
        <baseAddressPrefixFilters> 
         <add prefix="http://localhost"/> 
        </baseAddressPrefixFilters> 
    </serviceHostingEnvironment> 
    
    +0

    现在,那只是岩石!这是我在这个话题上看到的最好的帖子! – DDiVita 2009-06-01 15:22:36