2015-02-11 173 views
0

我想通过mvc wepApi从桌面应用程序向服务器发送JSON。 这是我的桌面应用程序代码,它将数据转换为JSON并发送。通过JSON发送数据

private void btnAddUserType_Click(object sender, EventArgs e) 
    { 
     UserType userType = new UserType(); 
     userType.UserTypeName = txtUserTypeName.Text; 

     string json = JsonConvert.SerializeObject(userType); 


     HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:3852/api/default1"); 
     httpWebRequest.ContentType = "text/json"; 
     httpWebRequest.Method = "POST"; 

     var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()); 
     streamWriter.Write(json); 


     var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
     var streamReader = new StreamReader(httpResponse.GetResponseStream()); 
     var responseText = streamReader.ReadToEnd(); 
    } 

,这是我的网页API

// POST api/default1 
    public void Post([FromBody]string value) 
    { 
     UserTypeRepository bl = new UserTypeRepository(); 
     DataContractJsonSerializer js = new DataContractJsonSerializer(typeof(UserType)); 
     MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(value)); 
     UserType u = new UserType(); 
     u = (UserType)js.ReadObject(stream); 
     bl.Add(u); 
    } 

但当交API的调用Value is null。 为什么?

+0

嗯......你可以尝试使用内容类型“application/json”吗?另外,在这种情况下,你可以尝试'public void Post([FromBody] UserType value)' - 你不必自己反序列化JSON。 此外,请通过调试并检查Request.Form对象(并查看在什么键下有什么可用)来检查您收到的内容。 – Gerino 2015-02-11 15:37:45

+0

@Gerino,它没有工作! – nimaSadeghpour 2015-02-11 15:55:20

+0

对我来说是一个简单的问题。 – 2015-02-11 17:39:52

回答

2
 using(var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
      streamWriter.Write(json); 

您不会冲洗也不关闭流,所以基本上数据永远不会到达api。

我的代码:

的Program.cs - 控制台应用程序

class Program 
{ 
    static void Main(string[] args) 
    { 
     var user = new UserModel {Id = 4, FirstName = "Michael", LastName = "Angelo"}; 
     var json = JsonConvert.SerializeObject(user); 
     HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://localhost:56506/api/Values/"); 
     httpWebRequest.ContentType = "application/json"; 
     httpWebRequest.Method = "POST"; 

     using(var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) 
      streamWriter.Write(json); 



     var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); 
     var streamReader = new StreamReader(httpResponse.GetResponseStream()); 
     var responseText = streamReader.ReadToEnd(); 
     Console.WriteLine(responseText); 
     Console.ReadKey(); 
    } 
} 

UserModel.cs - 一些数据类

public class UserModel 
{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public int Id { get; set; } 
} 

ValuesController.cs - 从模板的WebAPI控制器

public class ValuesController : ApiController 
{ 
    // GET api/values 
    public UserModel[] Get() 
    { 
     return UserProvider.Instance.Get(); // returns some test data 
    } 

    // GET api/values/5 
    public UserModel Get(int id) 
    { 
     return new UserModel{Id=1,FirstName="John",LastName="Smith"}; 
    } 

    // POST api/values 
    public void Post([FromBody]UserModel value) 
    { 
     if (value == null) // BREAKPOINT HERE, just to see what's in value 
     { 
      var x = value; 
     } 
    } 

} 

个WebApiConfig.cs - 与有关JSON添加的行默认的配置,但它的作品,没有它 - 它的,这样我可以测试浏览器等轻松搞定;)

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // Web API configuration and services 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 
     config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html")); 
     config.Routes.MapHttpRoute(
      name: "DefaultApi", 
      routeTemplate: "api/{controller}/{id}", 
      defaults: new { id = RouteParameter.Optional } 
     ); 
    } 
} 

结果:

Result of running console app

+0

我可以看到你的测试代码吗? – nimaSadeghpour 2015-02-11 17:27:14

+1

添加代码和图片:) – Gerino 2015-02-11 17:38:59

+0

非常感谢您... – nimaSadeghpour 2015-02-11 17:51:26