WCF RESTful控制台托管,返回400个错误请求
正在研究WCF RESTful,控制台中的主机 我的步骤:WCF RESTful控制台托管,返回400个错误请求,wcf,rest,console,host,Wcf,Rest,Console,Host,正在研究WCF RESTful,控制台中的主机 我的步骤: 创建示例模型 创建服务合同 创建服务 在控制台中托管此服务 运行此主机,看起来正常 创建一个winform,通过json post到服务主机使用服务地址 我希望它能起作用,但返回http 400 我试过WCF(不是REST)控制台托管,WebAPI,所有步骤都可以 最后是stackoverflow.com 请帮忙 型号 [Serializable] public abstract class Building { public
[Serializable]
public abstract class Building
{
public Manufacturer Manufacturer { get; set; }
}
[Serializable]
public class Manufacturer
{
public string Name { get; set; }
public string Telephone { get; set; }
}
[Serializable]
public class Furniture : Building
{
public string Name { get; set; }
}
[Serializable]
public class Reception
{
public int Floor { get; set; }
public int Number { get; set; }
}
[Serializable]
public class Room : Building
{
public string Number { get; set; }
public List<Furniture> Furnitures { get; set; }
}
[Serializable]
public class Hotel : Building
{
public Guid Guid { get; set; }
public List<Reception> Receptions { get; set; }
public List<Room> Rooms { get; set; }
public string Name { get; set; }
public string Address { get; set; }
}
服务
public class HotelService : I Hotel
{
public bool Build(Models.Hotel hotel)
{
if (hotel == null)
return false;
// codes here is object hotel(EF) creation, test OK
return true;
}
}
WebServiceHost serviceHost = new WebServiceHost(typeof(Demo.Services.HotelService), new Uri("http://192.168.1.101/HotelService"));
ServiceEndpoint endpoint = serviceHost.AddServiceEndpoint(typeof(Demo.Contracts.IHotel), new WebHttpBinding(), "");
ServiceDebugBehavior sdb = serviceHost.Description.Behaviors.Find<ServiceDebugBehavior>();
sdb.HttpHelpPageEnabled = false;
Console.WriteLine("Starting Service...");
// start service
serviceHost.Open();
Console.WriteLine("Started, press RETURN to exit.");
Console.ReadLine();
serviceHost.Close();
主机(控制台)
上的“boolbuildhotel(String)”的Json字符串
它需要这样的JSON: {“k_BackingField”:“k_BackingField”:“4”,“k_BackingField”:“4”},“k_BackingField”:“x”,“k_BackingField”:“ea59c011-d656-4870-b29b-30a44e668560”,“k_BackingField”:“x”,“k_BackingField”:[{“k_BackingField”:1,“k_BackingField”:1},{“k_BackingField”:2,“k_BackingField”:2],“k_BackingField”:“k"”:“k"3”,“k_BackingField”:[{“k_BackingField”:{“k_BackingField”:“1”,“k_BackingField”:“1”},“k_BackingField”:“1”},{“k_BackingField”:“2”,“k_BackingField”:“2”},“k_BackingField”:“2”}],“k_BackingField”:“空”} 要更改它,您可以使用DataContract和DataMember属性标记所有数据协定:
[DataContract]
public abstract class Building
{
[DataMember]
public Manufacturer Manufacturer { get; set; }
}
在这种情况下,它将理解您在问题中给出的json,并将成功处理它。您的json字符串在address元素之后包含一个Manufacturer元素,并且在Hotel类对象中没有属性。请尝试删除此元素,看看是否有效。
public bool BuildHotel(string json)
{
WebRequest request = HttpWebRequest.Create("http://192.168.1.101/HotelService");
request.ContentType = "application/json";
byte[] data = Encoding.UTF8.GetBytes(json);
request.ContentLength = data.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
WebResponse response = request.GetResponse(); // 400 throwed here
Stream responseStream = response.GetResponseStream();
StreamReader responseStreamReader = new StreamReader(responseStream);
string result = responseStreamReader.ReadToEnd();
return true;
}
{
"Guid":"ea59c011-d656-4870-b29b-30a44e668560",
"Receptions":[
{"Floor":1,"Number":1},
{"Floor":2,"Number":2}
],
"Rooms":[
{
"Number":"c",
"Furnitures":[
{"Name":"1","Manufacturer":{"Name":"1","Telephone":"1"}},
{"Name":"2","Manufacturer":{"Name":"2","Telephone":"2"}}
],
"Manufacturer":{"Name":"c","Telephone":"c"}
}
],
"Name":"x",
"Address":"x",
"Manufacturer":{"Name":"x","Telephone":"x"}
}
[DataContract]
public abstract class Building
{
[DataMember]
public Manufacturer Manufacturer { get; set; }
}