如何从自托管的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还是别的什么?
答案 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"
};
}
}
}