Использование WebInvoke для данных POST в WCF WebApi

Недавно я начал использовать WCF WebApi для создания REST API. Я следил за примерами, доступными на CodePlex, а также серия статей Алекса Цейтлера.

Я попытался создать метод, который принимает данные через 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. Имя параметра: name'. Смотрите журналы сервера для более подробной информации. Трассировка стека исключений:

в System.Net.WebHeaderCollection.CheckBadChars(имя строки, логическое значение isHeaderValue) в System.Net.WebHeaderCollection.Add(имя строки, значение строки) в System.Collections.Specialized.NameValueCollection.Add(NameValueCollection c) в System.ServiceModel.Activation .HostedHttpContext.HostedRequestContainer.System.ServiceModel.Channels.HttpRequestMessageProperty.IHttpHeaderProvider.CopyHeaders(заголовки WebHeaderCollection) в System.ServiceModel.Channels.HttpRequestMessageProperty.get_Headers() в Microsoft.ApplicationServer.Http.Channels.HttpMessageEncodingRequestContext(message.ConfigureRequest) :\codeplex\wcf\Http\Src\Microsoft.ApplicationServer.Http\Microsoft\ApplicationServer\Http\Channels\HttpMessageEncodingRequestContext.cs:строка 222 в Microsoft.ApplicationServer.Http.Channels.HttpMessageEncodingRequestContext.get_RequestMessage() в F:\codeplex\ wcf\Http\Src\Microsoft.ApplicationServer.Http\Microsoft\ApplicationServer\Http\Channels\Htt pMessageEncodingRequestContext.cs: строка 54 в System.ServiceModel.Dispatcher.ChannelHandler.EnsureChannelAndEndpoint (запрос RequestContext) в System.ServiceModel.Dispatcher.ChannelHandler.TryRetrievingInstanceContext (запрос RequestContext)

Любая идея, почему это происходит?


person Mahdi Taghizadeh    schedule 10.07.2011    source источник
comment
Где именно вы передаете этот объект JSON? Из вашего примера видно, что вы передаете его в заголовке сообщения.   -  person Ladislav Mrnka    schedule 10.07.2011


Ответы (1)


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

person Darrel Miller    schedule 10.07.2011
comment
@Mahdi: если вы откроете построитель запросов в Fiddler, там есть часть для заголовков запроса и тела запроса! - person Ladislav Mrnka; 11.07.2011