2

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

丹尼尔

4

1 回答 1

4

首先,由于您不想依赖 Microsoft Ajax ScriptManager,因此不要在 endpointBehaviors/behavior 中使用 <enableWebScript />。它是 Microsoft 特定的 JSON。

然而,幸运的是,WCF 使您的客户端可以很容易地决定他们需要 XML 还是通用 JSON。

  1. 使用<webHttp />行为。

    <endpointBehaviors>
    <behavior name="My.WcfServices.webHttpBehavior">
    <webHttp />
    </behavior>
    </endpointBehaviors>

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

  3. SerializeReply方法中,检查 URL。

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

  4. 定义你的方法

    [OperationContract]
    [WebGet(UriTemplate="Hello.{responseFormat}")] // 或 "Hello?format={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

  1. JSON 和 XML 都易于跨浏览器使用。诸如用于 JSON 的 jQuery 和用于 XML 的 Sarissa 之类的库使其变得更加容易。

注意:如果您看到错误“找不到与具有绑定 WebHttpBinding 的端点的方案 http 匹配的基地址。”,添加baseAddressPrefixFilters元素并将 localhost(或任何您的域)添加到 IIS 主机头名称。

<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true">
    <baseAddressPrefixFilters>
        <add prefix="http://localhost"/>
    </baseAddressPrefixFilters>
</serviceHostingEnvironment>
于 2009-06-01T14:41:23.193 回答