2015-02-11 175 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