Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF RESTful控制台托管,返回400个错误请求_Wcf_Rest_Console_Host - Fatal编程技术网

WCF RESTful控制台托管,返回400个错误请求

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

正在研究WCF RESTful,控制台中的主机

我的步骤:

  • 创建示例模型
  • 创建服务合同
  • 创建服务
  • 在控制台中托管此服务
  • 运行此主机,看起来正常
  • 创建一个winform,通过json post到服务主机使用服务地址
  • 我希望它能起作用,但返回http 400
  • 我试过WCF(不是REST)控制台托管,WebAPI,所有步骤都可以

    最后是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; }
    } 
    
    服务

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