2012-01-09 4 views
2

간단한 WCF RESTful 웹 서비스를 만들려고했지만 SOAP 모드에서만 작동하는 것으로 보입니다. 로컬 IIS로 서비스를 호스팅하고 있습니다.WCF REST Service가 HTTP 400 잘못된 요청을 반환합니다.

는 정말 표준 같습니다

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

과 : 나는 또한 config 파일의 동작을 포함에서 사용 된

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를 사용하는 스텁 클라이언트에서 로그인을 호출 할 때 피들러에서 정상적으로 보이지만 SOAPy입니다. 어떤 이유로 든 RESTy 방식으로 내 서비스를 호출 할 수 없으며/help도 400 잘못된 요청을 반환하는 것 같습니다. (http://localhost:8080/MyService.svc/help 또는/login 등)

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); 

동시에 MyService.Login 기능에서 WebGet 특성을 제거하십시오.

- 또는

은 system.web 아래의 Web.config에이 도움이

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

희망이 블록을 넣습니다.

+0

아직 아무것도 : ( 내가 얻는 것은 : 'HTTP/1.1 400 잘못된 요청 서버 : Microsoft-IIS/7.5 X-Powered-By : ASP.NET 날짜 : 2012 년 1 월 9 일 12:22:22 GMT 콘텐츠 길이 : 0' – Jacob

+0

시도해보십시오. <끝점 주소 = "정확한"구성 "을 사용하고 있습니다." "binding ="webHttpBinding "contract ="ContractName "behaviorConfiguration ="RestFriendly "> 하나의 동작

+0

이 정확한 구성을 사용하고 있습니다! (이름 만 "RestFriendly"대신 "webHttp"를 사용합니다 -하지만 변수 이름처럼 중요하지 않습니다 ...) – Jacob

1

나는 이유는 내 게시 XML은

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

위에

의 아래에 있었다 같은 문제가 있었다 나는 그것을 제거하고 그것은 단지 일했다!

+0

HTTP의 XML은 UTF-8입니다. – jinzai

관련 문제