Использование WebInvoke для POST-данных в WCF WebApi - PullRequest
1 голос
/ 10 июля 2011

Я недавно начал использовать WCF WebApi для создания API REST. Я проследил образцы, доступные на CodePlex, а также серию статей от Alex Zeitler.

Я попытался создать метод, который принимает данные через POST следующим образом:

[ServiceContract]
public class AuthenticateApi
{
    [WebInvoke(UriTemplate = "", Method = "POST")]  
    public HttpResponseMessage<LoginModel> Post(LoginModel loginModel)
    {
        loginModel.IsValidated = true;
        return new HttpResponseMessage<LoginModel>(loginModel);
    }
}

А это моя сущность:

public class LoginModel
{
    public string Username { get; set; }
    public string Password { get; set; }
    public bool IsValidated { get; set; }
}

И, наконец, это моя конфигурация в Global.asax:

public static void RegisterRoutes(RouteCollection routes)
{
   routes.MapServiceRoute<AuthenticateApi>("login");
}
protected void Application_Start(object sender, EventArgs e)
{
   RegisterRoutes(RouteTable.Routes);
}

Когда я пытаюсь ПОСТАВИТЬ что-то, используя Fiddler, таким образом:

Content-Type: application/json
Accept: application/json
{"Username": "mahdi", "Password":"123"}
Host: localhost:8181

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

Сервер обнаружил ошибку при обработке запроса. Исключение сообщение «Указанное значение содержит недопустимые символы заголовка HTTP. Имя параметра: имя '. Смотрите журналы сервера для более подробной информации. Исключение трассировка стека:

at System.Net.WebHeaderCollection.CheckBadChars (имя строки, логическое значение isHeaderValue) в System.Net.WebHeaderCollection.Add (имя строки, Строковое значение) в System.Collections.Specialized.NameValueCollection.Add (NameValueCollection кошка System.ServiceModel.Activation.HostedHttpContext.HostedRequestContainer.System.ServiceModel.Channels.HttpRequestMessageProperty.IHttpHeaderProvider.CopyHeaders (WebHeaderCollection заголовки) в System.ServiceModel.Channels.HttpRequestMessageProperty.get_Headers () в Microsoft.ApplicationServer.Http.Channels.HttpMessageEncodingRequestContext.ConfigureRequestMessage (Message сообщение) в F: \ CodePlex \ ФОС \ Http \ Src \ Microsoft.ApplicationServer.Http \ Microsoft \ ApplicationServer \ Http \ Channels \ HttpMessageEncodingRequestContext.cs: линия 222 в Microsoft.ApplicationServer.Http.Channels.HttpMessageEncodingRequestContext.get_RequestMessage () в F: \ CodePlex \ ФОС \ Http \ Src \ Microsoft.ApplicationServer.Http \ Microsoft \ ApplicationServer \ Http \ Channels \ HttpMessageEncodingRequestContext.cs: линия 54 в System.ServiceModel.Dispatcher.ChannelHandler.EnsureChannelAndEndpoint (RequestContext запрос) в System.ServiceModel.Dispatcher.ChannelHandler.TryRetrievingInstanceContext (RequestContext запрос)

Есть идеи, почему это происходит?

1 Ответ

5 голосов
/ 10 июля 2011

Поместите объект JSON в поле тела запроса, а не в заголовки.

...