2009-08-24 3 views
0

을 사용하여 편안한 wcf 서비스를 호출 할 때 http 400 오류가 발생했습니다. wcf 서비스를 설정했습니다. 불행히도, 나는 피들러, 웹, 또는 아무데도 통해 서비스를 호출하면 HTTP 400 오류가 발생합니다. 나는이 문제를 해결하기 위해 어디서부터 시작 해야할지 정말 당혹 스럽다. 모든 제안을 부탁드립니다. WSDL은 현재로서는 옵션이 아닙니다. REST가 필수입니다. 이전에 GET을 사용하여 전화를 걸 수 있었지만 유효성을 검사하기 위해 사용자 ID와 암호를 전달해야하므로 쉽게 볼 수 없었습니다.http 포스트

[WebInvoke(UriTemplate = "/Login", Method="POST", 
     ResponseFormat = WebMessageFormat.Xml, 
     BodyStyle = WebMessageBodyStyle.Wrapped)] 
    [OperationContract] 
    bool Login(string UserName, string PassWord, string AppKey); 

서비스는 다음과 같은 코드가 있습니다 :

WCF 서비스는 다음과 같은 인터페이스를 가지고 있습니다. 예,이 코드는 불완전하며 AppKey가 실제로 아무 것도하지 않는다는 것을 알고 있습니다.이 시점에서 자리 표시 자입니다.

public bool Login(string UserName, string PassWord, string AppKey) 
    { 
     bool bl = false; 
     if (String.IsNullOrEmpty(AppKey)) 
     { 
      throw (new ApplicationException(AppKeyNull)); 
     } 
     if (Membership.ValidateUser(UserName, PassWord)) 
     { 
      bl = true; 
     } 
     return (bl); 
    } 

피들러를 통해 서비스를 호출하려고합니다. 나는 다음과 같은 URL이 있습니다

http://127.0.0.1:82/WebServices/RemoteAPI.svc/Login 

을 나는 다음 헤더 설정이 있습니다

User-Agent: Fiddler 
Host: 127.0.0.1:82 
Content-Length: 46 
Content-Type: application/x-www-form-urlencoded 

을 나는 다음과 같은 몸의 설정이 있습니다

UserName=xxxxxx&PassWord=yyyyyy&AppKey=blah 

답변

0

는 400 오류가 일어날 수를 경우 콘텐츠 길이 당신이 어떤 이유로 그것을 스스로 계산한다면, 약간 벗어난 것입니다. http 요청의 전체 텍스트와 같은 더 많은 정보가 필요합니다.

+0

제안 해 주셔서 감사합니다. 내용 길이를 손으로 계산하고 46도 나왔습니다. 나는 fiddler가 이것을 스스로 계산할 수있게했다. 불행히도이 문제는 해결되지 않았습니다. –

+0

David에게 감사드립니다. 나는이 일을 얻었다. –

0

REST 서비스에 전달할 올바른 데이터 형식입니까?

난 단지 당신이 사용하고있는 가정 할 수있다 : http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webinvokeattribute.aspx

그리고 당신은 XML 및 JSON을 지원하는 RequestFormat를 지정하지 않는 것입니다. 몸이 JSON이나 XML이 아닙니다.

+0

은 json이고 xml 형식 만 지원됩니까? 나는 그것들이 복잡한 목적을위한 것이라고 생각했다. –

+0

감사합니다. Adam. 나는이 일을 얻었다. –

0

WCF REST Contrib을 확인하십시오. 또는 구현 메서드에서 Stream 매개 변수를 사용하고 HttpUtility.ParseQueryString 유틸리티를 사용하여 POSTed 본문에서 쿼리 문자열 값을 파싱 할 수 있습니다.

당신이 피들러와 함께 게시 할 때 다음 Content-Type: text/xml를 지정하고 새 데이터 계약이

[DataContract] 
public class LoginContract 
{ 
    [DataMember] 
    public string UserName { get; set; } 

    [DataMember] 
    public string PassWord { get; set; } 

    [DataMember] 
    public string AppKey { get; set; } 

} 

을 LoginContract 추가하려면 방법 서명을 변경하고이

[WebInvoke(UriTemplate = "/Login", Method = "POST", ResponseFormat = WebMessageFormat.Xml, RequestFormat= WebMessageFormat.Xml)] 
[OperationContract] 
bool Login(LoginContract loginInfo); 

속성을

:

2

이 사용 해보세요

귀하의 요청으로 사용하십시오. 본문

<LoginContract xmlns="http://schemas.datacontract.org/2004/07/YourAppName" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
<AppKey>blah</AppKey> 
<PassWord>testpwd</PassWord> 
<UserName>test</UserName></LoginContract> 

또는 요청 본문으로 JSON을 사용하려면 RequestFormat = WebMessageFormat을 변경하십시오."Content-Type을"는 요청 헤더에없는 경우 JSON과 요청 본문으로

{ "AppKey": "blah", "PassWord": "testpwd", "UserName": "test" } 
0
User-Agent: Fiddler 
Host: localhost:8889 
Content-Length: 113 
**Content-Type: text/xml** 

확인이을에 통과?