2013-08-30 26 views
2

学习WCF REST风格,主机控制台,WCF REST风格的控制台主办,返回400错误的请求

我的步骤:

  1. 创建样本模型
  2. 创建服务合同
  3. 创建服务
  4. 在控制台中托管此服务。
  5. 运行这个主机,看起来不错。
  6. 创建一个winform,通过json post使用服务地址来服务主机。
  7. 我希望它的工作,但返回的HTTP 400

我尝试了WCF(不是REST)控制台主办,的WebAPI,步骤一切ok。

finally,stackoverflow。COM

请帮助

模式

[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; } 
} 

合同

[ServiceContract] 
public interface IHotel 
{ 
    // Create objct Hotel 
    [OperationContract] 
    [WebInvoke(UriTemplate = "", Method = "POST", RequestFormat= WebMessageFormat.Json, ResponseFormat=WebMessageFormat.Json)] 
    bool Create(Hotel hotel); 
} 

服务

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(); 

客户端(WinForm的)

来电

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; 
} 

JSON字符串为 '布尔BuildHotel(串)' 在

{ 
    "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"} 
} 
+0

您的JSON字符串在您的地址元素之后包含制造商元素,并且您的Hotel Class对象中没有属性。尝试删除此元素,看看是否有效。 – Rajesh

回答

0

,预计这类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_ BackingField “:{” K _BackingField “:” 3" , “k_ BackingField “:” 3 “},” K _BackingField “:[{” K_ BackingField “:{” K _BackingField “:” 1" , “K_ BackingField”: “1”}, “K _BackingField” :“1”},{“k_ BackingField”:{“k _BackingField”:“2”,“k_ BackingField”:“2”},“k _BackingField”:“2”}],“k__BackingField” :空}]}

要改变它,你可以标记与DataContract和所有数据契约数据成员属性:如您在给我们

[DataContract] 
    public abstract class Building 
    { 
     [DataMember] 
     public Manufacturer Manufacturer { get; set; } 
    } 

在这种情况下,它会明白JSON该问题将会成功处理。

相关问题