从自托管WCF 4.5服务返回JSON?

时间:2013-03-20 19:40:27

标签: json wcf rest self-hosting

如何从自托管的WCF 4.5服务获取JSON?

我正在使用Fiddler2发送带有“Content-Type:application / json”的请求(也尝试过“Content-Type:application / javascript”),但我一直在获取XML。

结合在我的WebHttpBehavior上设置“AutomaticFormatSelectionEnabled = true”,我仍然得到XML,当使用“Content-Type:application / json”时,服务器根本不会响应(然后我得到错误103)

我在WebHttpBinding上启用了CrossDomainScriptAccessEnabled,并且我在控制台主机中使用了WebServiceHost。

服务非常简单:

[ServiceContract]
public interface IWebApp
{
  [OperationContract, WebGet(UriTemplate = "/notes/{id}")]
  Note GetNoteById(string id);
}

我也尝试将AutomaticFormatSelectionEnabled设置为false并在我的服务合同中使用ResponseFormat = WebMessageFormat.Json,但这也导致“错误103”而没有进一步的信息。

我已经转换了customErrors并将FaultExceptionEnabled,HelpEnabled设置为true(不确定是否会对此做任何事情,但只是为了确保我已经尝试过所有这些)

我错过了一个dll还是别的什么?

1 个答案:

答案 0 :(得分:5)

尝试从简单开始,如下面的代码(适用于4.5)。从那里,您可以开始添加代码一次使用的功能,直到您发现它中断的那一刻。这会让你更好地了解出了什么问题。

using System;
using System.Net;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            string baseAddress = "http://localhost:8000/Service";
            WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress));
            host.Open();
            Console.WriteLine("Host opened");

            WebClient c = new WebClient();
            Console.WriteLine(c.DownloadString(baseAddress + "/notes/a1b2"));

            Console.WriteLine("Press ENTER to close");
            Console.ReadLine();
            host.Close();
        }
    }

    public class Note
    {
        public string Id { get; set; }
        public string Title { get; set; }
        public string Contents { get; set; }
    }

    [ServiceContract]
    public interface IWebApp
    {
        [OperationContract, WebGet(UriTemplate = "/notes/{id}", ResponseFormat = WebMessageFormat.Json)]
        Note GetNoteById(string id);
    }

    public class Service : IWebApp
    {
        public Note GetNoteById(string id)
        {
            return new Note
            {
                Id = id,
                Title = "Shopping list",
                Contents = "Buy milk, bread, eggs, fruits"
            };
        }
    }
}