2014-09-09 4 views
0

Я пишу службу с использованием MVC 4 Web API для получения POST от стороннего сервиса. Это простой пост с строковым параметром в теле, который выглядит как key=value.MVC4 API простых типов API API: null

Это в значительной степени контроллер по умолчанию, созданный в Visual Studio:

// POST api/register 
public void Post([FromBody]string value) 
{ 
} 

Если я выкладываю параметр в теле как key=value, параметр всегда NULL, когда она попадает на службу.

POST http://localhost:1750/api/Register HTTP/1.1 
Accept-Encoding: gzip,deflate 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 15 
Host: localhost:1750 
Connection: Keep-Alive 
User-Agent: Apache-HttpClient/4.1.1 (java 1.5) 

value=abcdefg 

Если удалить ключ и только вывешиваем =value то значение проступает.

POST http://localhost:1750/api/Register HTTP/1.1 
Accept-Encoding: gzip,deflate 
Content-Type: application/x-www-form-urlencoded 
Content-Length: 15 
Host: localhost:1750 
Connection: Keep-Alive 
User-Agent: Apache-HttpClient/4.1.1 (java 1.5) 

=abcdefg 

Проблема заключается служба третьей стороны размещение key=value. Как я могу заставить свой сервис работать правильно?

+0

параметр переименования в 'общественной недействительным сообщение ([FromBody] строка ключа)'? – JleruOHeP

+0

Это была одна из первых вещей, которые я пробовал. Неважно, что я называю параметром. – earthling

+0

Я уверен, что вы видели сообщение, в котором у вас есть обходное решение, но для других, следующих за http://stackoverflow.com/questions/11515319/frombody-not-binding-string-parameter, есть некоторые полезные ссылки ... –

ответ

0

Каков ваш MediaType по умолчанию?

1 раствор

Сделать класс

public Class Item { 

    public string Value { get; set;} 

    } 

Тогда

[HttpPost] 
public void Post([FromBody]Item item) 
{ 
    // item.Value should have your data. 
} 

второе решение Если вы не можете контролировать то, как данные поступают, вы можете попросить их, чтобы кодировать текст когда они отправляются?

В этом вы можете получить как строку как значение% 3dxyz Тогда вы можете получить свою строковую переменную и манипулировать ее декодированием.

третье решение

Используйте свой заказ Serializer что-то вроде этого:

public class CustomJsonMediaFormatter : JsonMediaTypeFormatter 
    { 
    private JsonSerializerSettings _jsonSerializerSettings; 

     public CustomJsonMediaFormatter() 
     { 
      _jsonSerializerSettings = CreateDefaultSerializerSettings(); 
     } 

    private object ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger) 
     { 

var contentHeaders = content == null ? null : content.Headers; 

      // If content length is 0 then return default value for this type 
      if (contentHeaders != null && contentHeaders.ContentLength == 0) 
      { 
       return GetDefaultValueForType(type); 
      } 

      // Get the character encoding for the content 
      var effectiveEncoding = SelectCharacterEncoding(contentHeaders); 

      try 
      { 
       using (var reader = (new StreamReader(readStream, effectiveEncoding))) 
       { 
        var json = reader.ReadToEnd(); 
        var jo = JObject.Parse(json); 
          // jo has got your value=xyz manipulate and feed back. 
       } 
      }