启用 WCF 数据服务默认接受/返回 JSON

2024-04-30

我有一个 WCF 数据服务,我希望默认情况下为所有操作返回 JSON。我可以在配置/通过服务属性中设置它吗?


为了通过 $format 标签启用 json,如下所示:

host:8038/YourService.svc/?$format=json

将此属性添加到您的服务声明中:

[JSONPSupportBehavior]
public class Service : DataService<YourEntities>

将其作为一个类添加到您的服务中:

using System;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using System.ServiceModel.Dispatcher;
using System.Text;
using System.Xml;

namespace YourNamespaceHere.Service
{
public class JSONPSupportInspector : IDispatchMessageInspector
{
    // Assume utf-8, note that Data Services supports
    // charset negotation, so this needs to be more
    // sophisticated (and per-request) if clients will 
    // use multiple charsets
    private static Encoding encoding = Encoding.UTF8;

    #region IDispatchMessageInspector Members

    public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, IClientChannel channel, InstanceContext instanceContext)
    {
        if (request.Properties.ContainsKey("UriTemplateMatchResults"))
        {
            HttpRequestMessageProperty httpmsg = (HttpRequestMessageProperty)request.Properties[HttpRequestMessageProperty.Name];
            UriTemplateMatch match = (UriTemplateMatch)request.Properties["UriTemplateMatchResults"];

            string format = match.QueryParameters["$format"];
            if ("json".Equals(format, StringComparison.InvariantCultureIgnoreCase))
            {
                // strip out $format from the query options to avoid an error
                // due to use of a reserved option (starts with "$")
                match.QueryParameters.Remove("$format");

                // replace the Accept header so that the Data Services runtime 
                // assumes the client asked for a JSON representation
                httpmsg.Headers["Accept"] = "application/json";

                string callback = match.QueryParameters["$callback"];
                if (!string.IsNullOrEmpty(callback))
                {
                    match.QueryParameters.Remove("$callback");
                    return callback;
                }
            }
        }
        return null;
    }

    public void BeforeSendReply(ref System.ServiceModel.Channels.Message reply, object correlationState)
    {
        if (correlationState != null && correlationState is string)
        {
            // if we have a JSONP callback then buffer the response, wrap it with the
            // callback call and then re-create the response message

            string callback = (string)correlationState;

            XmlDictionaryReader reader = reply.GetReaderAtBodyContents();
            reader.ReadStartElement();
            string content = JSONPSupportInspector.encoding.GetString(reader.ReadContentAsBase64());

            content = callback + "(" + content + ")";

            Message newreply = Message.CreateMessage(MessageVersion.None, "", new Writer(content));
            newreply.Properties.CopyProperties(reply.Properties);

            reply = newreply;
        }
    }

    #endregion

    class Writer : BodyWriter
    {
        private string content;

        public Writer(string content)
            : base(false)
        {
            this.content = content;
        }

        protected override void OnWriteBodyContents(XmlDictionaryWriter writer)
        {
            writer.WriteStartElement("Binary");
            byte[] buffer = JSONPSupportInspector.encoding.GetBytes(this.content);
            writer.WriteBase64(buffer, 0, buffer.Length);
            writer.WriteEndElement();
        }
    }


}
// Simply apply this attribute to a DataService-derived class to get
// JSONP support in that service
[AttributeUsage(AttributeTargets.Class)]
public class JSONPSupportBehaviorAttribute : Attribute, IServiceBehavior
{
    #region IServiceBehavior Members

    void IServiceBehavior.AddBindingParameters(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase, System.Collections.ObjectModel.Collection<ServiceEndpoint> endpoints, System.ServiceModel.Channels.BindingParameterCollection bindingParameters)
    {
    }

    void IServiceBehavior.ApplyDispatchBehavior(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
        foreach (ChannelDispatcher cd in serviceHostBase.ChannelDispatchers)
        {
            foreach (EndpointDispatcher ed in cd.Endpoints)
            {
                ed.DispatchRuntime.MessageInspectors.Add(new JSONPSupportInspector());
            }
        }
    }

    void IServiceBehavior.Validate(ServiceDescription serviceDescription, ServiceHostBase serviceHostBase)
    {
    }

    #endregion
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

启用 WCF 数据服务默认接受/返回 JSON 的相关文章

  • Jackson JSON + Java 泛型

    我正在尝试将以下 JSON 反序列化 映射到List
  • 如何使用重复的键动态生成 JSON 对象?

    我知道这听起来不可能 但我的老板告诉我 我必须使用 jQuery 通过 AJAX 后调用发送 JSON 并且必须具有重复的键 问题是 如果我写这样的东西 post someurl key1 value1 key2 value2 key2 v
  • 使用 Node.JS,如何将 JSON 文件读入(服务器)内存?

    背景 我正在使用 Node js 进行一些实验 并且希望从文本文件或 js 文件 哪个更好 读取 JSON 对象到内存中 以便我可以从代码快速访问该对象 我意识到有像 Mongo Alfred 等这样的东西 但这不是我现在需要的 Quest
  • 如何向我的 Spring MVC REST 服务添加错误?

    如果用户没有输入我正在编码的两个名称 我如何更改 更新来自 Spring MVC 的以下 REST 调用以返回错误 未找到 RequestMapping value name method RequestMethod GET Respons
  • 如何在具有现有记录的 json 数据表顶部添加新行

    我试图在数据表顶部添加一行 显示 金额 列的总和 我正在使用 json 数据表 jquery 插件 列表来显示数据表 如何将此行与现有行一起添加到数据表顶部 我认为这段代码会对你有所帮助 var json uid user123 first
  • 从一个客户端使用多个 WCF 服务

    我的网络场有 10 台运行 IIS 的服务器 在每台服务器上我都有相同的网站和相同的 WCF 服务 它公开了一些用于读取 删除缓存 会话 应用程序变量和其他内部数据的功能 在其他一些 Web 服务器上 我有一个 管理 Web 应用程序 它是
  • 自定义行为的配置错误

    我创建了一个与 WCF 服务一起使用的自定义行为 以将所有错误记录到应用程序日志中 我做了一个BehaviorExtensionElement对于行为 public ErrorLoggingBehaviorExtensionElement
  • 无法加载文件或程序集“Newtonsoft.Json”或其依赖项之一

    首先 它不仅仅是重复的 以下问题的答案都不适合我 http goo gl tS40cn http goo gl tS40cn http goo gl pH6v2T http goo gl pH6v2T 我刚刚使用 Nuget 包管理器更新了
  • JsonCpp - 当有 json::Value 对象时,我如何知道它的键名称?

    假设我有这个 Json 文件 id 0 使用 jsoncpp 我可以有一个Json Value通过这样做来对象 Json Value node root 0u id 好的 在代码的其他地方 我明白了node对象 我想从中获取一些信息 我可以
  • PostgreSQL:比较 json [重复]

    这个问题在这里已经有答案了 众所周知 目前 PostgreSQL 还没有方法来比较两个 json 值 比较就像json json不起作用 但是选角呢json to text before Then select x a y b json t
  • 优化数据可视化 Web 应用程序的性能

    我正在重写 3 年前编写的数据可视化网络工具 从那时起 浏览器的 JavaScript 引擎变得更快 所以我正在考虑将部分工作从服务器转移到客户端 在页面上 数据在表格和地图 或图表 中可视化 它使用相同的数据 但以不同的方式 因此准备显示
  • 从 json 数组获取值并执行 sql 插入

    这是我的数组 json 1 Device ID a9a3346be4375a92 Date 2012 05 31 Time 15 22 59 Latitude 51 4972912 Longitude 0 1108178 2 Device
  • WCF 服务参考支持文件未更新

    我有一个 VS 2010 解决方案 其中包含一个 WCF 服务项目和一个单元测试项目 单元测试项目有一个对WCF服务的服务引用 WCF 服务项目的 Web config 将许多绑定属性设置为非默认值 网络配置 特别注意maxBufferSi
  • JSON 中的哈希到底是什么?

    我正在学习 JSON 但我发现你也可以将所谓的 哈希 放入 JSON 中 我在哪里可以找到什么是哈希 或者你能向我解释一下什么是哈希吗 另外 什么是哈希图 我有 C 和 C 经验 正在学习 JS Jquery 和 JSON 哈希是一个稀疏数
  • WCF WebHttp 混合身份验证(基本和匿名)

    所有这些都与 WebHttp 绑定有关 托管在自定义服务主机中 IIS 目前不是一个选项 我已经实现了自定义 UserNamePasswordValidator 和自定义 IAuthorizationPolicy 当我将端点的绑定配置为使用
  • 意外的令牌:尝试解析 JSON 字符串时

    我正在尝试解析这个 JSON 字符串 RESULTS name Thessaloniki GR type Sailing l sailing weather beach Porto 20Carras 20Marina 45904 name
  • 如何为本机启用现有 WCF 服务的 JSONP?

    我有一个现有的服务 如下方法 AspNetCompatibilityRequirements RequirementsMode AspNetCompatibilityRequirementsMode Allowed ServiceBehav
  • Swift 3 中的 JSON 解析

    有没有人能够找到一种在 Swift 3 中解析 JSON 文件的方法 我已经能够返回数据 但在将数据分解为特定字段时我没有成功 我会发布示例代码 但我已经尝试了很多不同的方法但没有成功 并且没有保存任何代码 我想要解析的基本格式是这样的 提
  • 通信对象 System.ServiceModel.Channels.ServiceChannel 不能用于通信

    通信对象System ServiceModel Channels ServiceChannel 无法用于通信 因为它处于故障状态 这个错误到底是什么意思 我该如何解决它 您收到此错误是因为您让服务器端发生 NET 异常 并且您没有捕获并处理
  • JSON-LD 缺少“}”或对象成员名称。错误

    我喜欢将 json ld 添加到我的网站 然后我想将它添加到我的开发网站来测试它 我收到错误消息 指出缺少 或对象成员名称 这是什么错误 我已正确关闭括号 如何修复它

随机推荐

  • 在嵌套有序字典 python 中查找给定键的值

    我试图从嵌套的 OrderedDict 中查找给定键的值 关键点 我不知道这个字典会嵌套多深 我正在寻找的键的名称是不变的 它将位于字典中的某个位置 我想返回本例中名为 powerpoint color 的键的值 mydict Ordere
  • Powershell/PowerCLI 循环、超时和退出

    以下是场景 我通过 Powershell PowerCLI VMwares Powershell 模块 远程启动虚拟机 一旦虚拟机启动 我将针对虚拟机运行一系列 cmdlet 目前我有这段代码 Start VM my VM Name run
  • 继续在文件的同一行写入

    我已经使用以下命令打开了要写入的文件 data open input a 使用循环 我想在同一行中向文件写入一些单词 在每次循环迭代之后我想添加一个换行符 while loop for loop do something if some c
  • 如何创建自定义主题并在 Android 应用程序中使用它?

    如何创建自定义主题并在代码中使用它 菜单中如何实现主题选项并申请活动 有一个不错的风格和主题指南 http developer android com guide topics ui themes html在 Android 开发者网站上
  • Nuget:packages.config 中的 属性的用途是什么?

    我将我的 C 项目 已经有一些 nuget 包 从 4 0 升级到 4 5 2 我看到有些
  • 覆盖主干“设置”方法

    我想重写骨干集方法 以便每当我为骨干模型设置一个值时 都会调用在该属性上注册的回调 而无需检查该属性的相同先前值 var model Backbone Model extend defaults prop1 true var view Ba
  • 使用反射检查java中的字段是否为final

    我正在编写一个类 它在某些时候必须拥有它的所有内容Fields 从该类的另一个项目分配 我通过反思做到了 for Field f pg getClass getDeclaredFields f set this f get pg 问题是 这
  • 如何在首选项标头中使用 PreferenceFragmentCompat

    我正在尝试学习在 Xamarin Android 应用程序中构建首选项页面的方法 我发现了很多 PreferenceFragment 的例子 但它被标记为已弃用 我在现阶段很难重写它们 我创建了代表标题的活动 我添加了 IntentFilt
  • iTextSharp 居中对齐文档对象内的对象

    是否有一种快速而简单的方法可以将文档对象中的对象居中对齐 Without执行任何计算逻辑 即 获取页面宽度 获取内容宽度 除以二等 我在 Document 对象内的 Paragraph 对象中有一个 PdfPTable 对象 我想将段落对象
  • 如何在屏幕上锚定 Tkinter 窗口(不可移动窗口)

    我正在尝试在特定位置打开 tkinter 如果它是不可移动的 那就更好了 我搜索文档和其他内容 但没有找到任何相关内容 最好的方法是将顶部或底部固定在一个位置 x y 如果需要 我可以调整窗口大小 def my functions prin
  • 发布版本和 CLI 出现 aurelia-dialog 错误

    我在使用新的 aurelai 版本时遇到问题 我使用以下命令创建了一个新应用程序 au new myApp 我通过 npm 安装了 aurelia dialog 当我导入 aurelia dialog 并尝试使用运行应用程序时 au run
  • 为什么我的 android 项目中 onStart() 方法在 onCreate 之前运行?

    根据 Activity 的生命周期 onCreate 在应用创建时会被调用一次 然后 onStart 方法在整个 Activity 生命周期中可能会被调用多次 然而这并不是发生在我身上的事情 我的 onCreate 方法中有以下代码 mRe
  • App Engine Cron 作业始终返回 HTTP 状态代码 301

    我已关注本指南 https cloud google com appengine docs flexible ruby scheduling jobs with cron yaml为我的 Rails 应用程序创建 cron 作业 但 HTT
  • 标签 标签语义

    我读了this https stackoverflow com questions 1094352 can a label only refer to input elements我通常使用跨度或强来描述 文本标签 对于最佳实践来说这是真的
  • org.dozer.MappingException:找不到字段的读取或写入方法

    org dozer MappingException 找不到字段的读取或写入方法 tarShipMethodCode lmCourier courierName 在类 class com essilor ong domain invento
  • 比较字符变量

    我想在 R Studio 中比较两个不同的字符变量 第一列 BZ Pred 显示参与者预测的 5 个最常用的应用程序 第二列 BZ Act 显示实际使用最多的 5 个应用程序 现在我想创建第三列 如果第一个应用程序被正确猜测 则包含 是 如
  • ASP.NET 中的网络凭据错误

    我正在尝试使用 NetworkCredential 类通过 ASP NET 访问网页 但是我不断收到以下消息的异常System Security Cryptography CryptographicException The handle
  • 为什么在将应用程序部署到 Heroku 时会出现此错误?

    使用 git hub 将应用程序部署到 heroku 时遇到某种错误 问题是 我不理解 heroku 日志和随之而来的错误 这是 Heroku 日志 Marcuss MacBook Pro Weather App marcushurney
  • 公钥的长度(加密)可以与私钥不同吗?

    我有一个 1024 位的私钥 并用它来生成公钥 这是否自动意味着我的公钥也具有 1024 加密 或者它的加密大小可以更小吗 512 256 PS 我最感兴趣并谈论的是 RSA 密钥中模数 n 的大小 大小通常为 1024 或 2048 位
  • 启用 WCF 数据服务默认接受/返回 JSON

    我有一个 WCF 数据服务 我希望默认情况下为所有操作返回 JSON 我可以在配置 通过服务属性中设置它吗 为了通过 format 标签启用 json 如下所示 host 8038 YourService svc format json 将