2015-02-11 4 views
0

Я хочу отправить JSON из настольного приложения на сервер с помощью mvc wepApi. это мой рабочий код приложения, который преобразует данные в 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(); 
    } 

и это мой веб-апи

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

но когда пост апи называет Value is null. Почему?

+0

Хм ... Можете ли вы попробовать использовать тип контента 'application/json'? Кроме того, в этом случае вы можете попробовать 'public void Post ([FromBody] UserType value)' - вам не нужно десериализовать JSON самостоятельно. Также проверьте, что вы получаете, отлаживая и проверяя объект Request.Form (и посмотрите, что доступно под каким ключом). – Gerino

+0

@ Герино, это не сработало! – nimaSadeghpour

+0

его легкий вопрос для меня. –

ответ

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

Вы не смываете и не закрываете поток, поэтому в основном данные никогда не попадают на api.

Мой код:

Program.cs - Console App

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, но он работает без IT -это так, что я могу проверить легко получить в браузере и т.д.);

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

+1

Добавлен код и картинка :) – Gerino

+0

Спасибо большое ... – nimaSadeghpour

Смежные вопросы