2012-01-09 3 views
2

Я пытался создать простой веб-сервис WCF RESTful, но, похоже, работает только в режиме SOAP. Я принимаю мой сервис с локальным IIS.WCF REST Service возвращает HTTP 400 Bad Request

Это выглядит действительно стандарт:

[ServiceContract] 
public interface IMyService 
{ 
    [OperationContract] 
    Guid Login(string username, string password); 
... 

и:

public class MyService : IMyService 
{ 
    [WebGet(UriTemplate = "login?user={user}&password={password}", BodyStyle = WebMessageBodyStyle.Bare, ResponseFormat = WebMessageFormat.Json)] 
    public Guid Login(string username, string password) 
    { 
     return Guid.Empty; 
    } 

Я также включал поведение в конфигурационном файле и использовать его в:

<endpoint address="" binding="webHttpBinding" contract="MyService" behaviorConfiguration="webHttp"/> 

по всем из примеров, которые я знаю ...

Теперь дело в том, что вы вызываете логин от клиента-заглушки, который использует ServiceReference, он отлично выглядит в Fiddler, но он SOAPy. По какой-то причине я не могу ссылаться на свою услугу способом RESTy, даже если/help возвращает 400 Bad Request. (Я призываю http://localhost:8080/MyService.svc/help или/логин и т. Д.)

Что мешает REST принять меры? Заранее спасибо :)

Редактировать: Я нашел ответ.

Оказывается, нужно определить маршрутизацией ...

После добавления этого к Global.asax:

protected void Application_Start(object sender, EventArgs e) 
    { 
     RouteTable.Routes.Add(new ServiceRoute("MyService", 
      new WebServiceHostFactory(), typeof(MyService))); 
    } 

Он прошел просто отлично.

Плюс Я заработал, что «.svc» теперь не является частью URL-адреса.

+0

Как правило, вход в систему через GET считается плохой практикой, поскольку это концептуально изменение состояния. Используйте POST (более HTTPS для предпочтения). –

+0

Чтобы вызвать службу REST, вы не должны указывать ссылку на службу на стороне клиента. Вам нужно использовать класс HttpWebRequest, чтобы вызвать его путь RESTful. – Rajesh

ответ

1

Ваш код выглядит хорошо для меня. Можете ли вы попробовать пару вещей

[OperationContract] 
[WebGet(UriTemplate = "/Login/{username}/{password}", ResponseFormat = WebMessageFormat.Xml)] 
Guid Login(string username, string password); 

В то же время удалите атрибут WebGet из функции MyService.Login.

-ИЛИ-

Поместите этот блок в вашем web.config под system.web

<webServices> 
    <protocols> 
    <add name="HttpGet"/> 
    <add name="HttpPost"/> 
    </protocols> 
</webServices> 

Надеюсь, что это помогает.

+0

Все еще ничего :( Все, что я получаю, это: 'HTTP/1.1 400 Плохой запрос Сервер: Microsoft-IIS/7.5 X-Powered by: ASP.NET Дата: Пн, 09 Янв 2012 12:22:22 GMT Content-Length: 0' – Jacob

+0

Попробуйте и одно поведение <поведение name = "RestFriendly">

+0

Я использую эту точную конфигурацию! (только имя отличается, а не «RestFriendly». Я использую «webHttp» - но, я думаю, это не имеет значения, точно так же, как имя переменной ...) – Jacob

1

Я была такая же проблема причина была моя посылка XML была ниже на верхней

<?xml version="1.0" encoding="utf-16"?> 

Я удалил его, и он просто работает!

+0

XML в HTTP - только UTF-8. – jinzai

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