2012-05-01 4 views
3

У меня есть довольно прямой ApiController, который отлично работает на Win7, но на Windows 2003 Server я получаю сообщение об ошибке.Нет MediaTypeFormatter доступен на Windows 2003 Server

запрос ГЭТ (или из браузера или $ .getJSON):

https://site.com:61656/AD/Authenticate?UserName=xxxx&Password=xxxxx&AuthKey=xxxxxx

Я получаю следующее сообщение об ошибке:

<Exception xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/System.Web.Http.Dispatcher"> 
<ExceptionType>System.InvalidOperationException</ExceptionType> 
<Message> 
No MediaTypeFormatter is available to read an object of type 'InputModel' from content with media type ''undefined''. 
</Message> 
<StackTrace> 
at System.Net.Http.HttpContentExtensions.ReadAsAsync[T](HttpContent content, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger) at System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync(HttpRequestMessage request, Type type, IEnumerable`1 formatters, IFormatterLogger formatterLogger) at System.Web.Http.ModelBinding.FormatterParameterBinding.ExecuteBindingAsync(ModelMetadataProvider metadataProvider, HttpActionContext actionContext, CancellationToken cancellationToken) at System.Web.Http.Controllers.HttpActionBinding.<>c__DisplayClass1.<ExecuteBindingAsync>b__0(HttpParameterBinding parameterBinder) at System.Linq.Enumerable.WhereSelectArrayIterator`2.MoveNext() at System.Threading.Tasks.TaskHelpers.IterateImpl(IEnumerator`1 enumerator, CancellationToken cancellationToken) 
</StackTrace> 
</Exception> 

Я использую 5/1/2012 NuGet ночные пакеты сборки. Похоже, что objectContent.Value приходит через нуль на Windows 2003 Server, но не на Windows 7 в следующей строке в HttpContentExtensions.cs:

 if (objectContent != null && objectContent.Value != null && type.IsAssignableFrom(objectContent.Value.GetType())) 
     { 
      return TaskHelpers.FromResult((T)objectContent.Value); 
     } 

Действие контроллера:

[AcceptVerbs("GET", "POST")] 
    public ResultModel Authenticate(InputModel inputModel) 
    { 
     var test = ControllerContext.Request.Content.Headers.ContentType; 
     //Console.WriteLine(test.MediaType); 
     try 
     { 
      Console.WriteLine("AD Authorize request received: " + inputModel.UserName); 
      var ldap = new LdapAuthentication(); 
      return ldap.Authenticate(inputModel); 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      return new ResultModel(); 
     } 
    } 

MediaType приходит через null на Win7, но на сервере Windows 2003 запрос никогда не доходит до действия контроллера.

Есть ли способ указать форматировщик мультимедийных данных по умолчанию, который обрабатывал бы «неопределенный» тип носителя?

EDIT:

Вот вход модели:

public class InputModel { 

    public string UserName { get; set; } 
    public string Password { get; set; } 
    public string AuthKey { get; set; } 
} 

А вот (само хозяин) конфигурации:

 var config = new HttpsSelfHostConfiguration(ConfigurationManager.AppSettings["serviceUrl"]); 

     config.IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always; 
     config.Routes.MapHttpRoute("default", "{controller}/{action}"); 

     var server = new HttpSelfHostServer(config); 

     try 
     { 
      server.OpenAsync().Wait(); 
      Console.WriteLine("Waiting..."); 

EDIT # 2:

У меня есть заметил более интересное поведение Win7 vs Windows 2003 Server. Если я удалю параметр InputModel в действии контроллера, действие вызывается во время работы как на Win7, так и на Windows 2003 Server. Однако на Win7 он возвращает JSON из обоих GET запросов POST. На Windows 2003 Server он возвращает XML из GET и JSON из POST.

Это привело меня к тестированию параметра InputModel с помощью POST. Я проверил, что действие вызывается правильно, а параметр InputModel связан на Windows 2003 Server, но только при использовании POST. Таким образом, обходным решением будет захват параметров вручную на GET. Это позволяет Jquery в $ .getJSON работать против сервера размещенного себя под Windows 2003 Server:

[AcceptVerbs("GET")] 
public ResultModel Authenticate() 
{ 

    try 
    { 
     var inputModel = new InputModel(); 
     var query = ControllerContext.Request.RequestUri.ParseQueryString(); 
     inputModel.UserName = query.GetValues("UserName") != null ? query.GetValues("UserName")[0] : null; 
     inputModel.Password = query.GetValues("Password") != null ? query.GetValues("Password")[0] : null; 
     inputModel.AuthKey = query.GetValues("AuthKey") != null ? query.GetValues("AuthKey")[0] : null; 
     Console.WriteLine("AD Authorize request received: " + inputModel.UserName); 
     var ldap = new LdapAuthentication(); 
     return ldap.Authenticate(inputModel); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
     return new ResultModel(); 
    } 
} 
+0

Любое повезло с этим? У меня такая же проблема. –

ответ

0

Можете ли вы показать сконфигурированные форматтеры, а также ваш класс InputModel? Похоже, сериализатор не может обрабатывать ваш класс. Используете ли вы интерфейсы для любого из свойств?

+0

Я добавил модель ввода и конфигурацию. Он привязывает InputModel при работе под Win7, просто не под Windows 2003 Server – CharlieK

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