2011-09-09 8 views
2

HTTP POST를 통해 WCF 서비스를 호출하려고하는데 서비스가 400 오류를 반환합니다. 이것이 OperationContract 또는 POST를 수행하는 방식 때문인지 여부는 알 수 없습니다.WCF 서비스에 대한 HTTP POST

HttpWebRequest webRequest = WebRequest.Create("http://localhost:8000/File/Download") as 
HttpWebRequest; 
webRequest.Method = "POST"; 
webRequest.ContentType = "application/x-www-form-urlencoded"; 
byte[] bytes = Encoding.ASCII.GetBytes("username=test&fileid=1"); 
Stream os = null; 
webRequest.ContentLength = bytes.Length; 
os = webRequest.GetRequestStream(); 
os.Write(bytes, 0, bytes.Length); 
os.Close(); 
WebResponse webResponse = webRequest.GetResponse(); 

이 편집 : 내가 그것을해야 내가 테스트 콘솔 응용 프로그램을 통해 서비스를 호출하기 위해 노력하고있어 방법

[OperationContract, WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped)] 
Stream Download(string username, int fileid); 

을 그리고 여기이 계약은 서버 측에 모습입니다 내 목표는 서비스를 테스트하는 것이지 원시 HTTP POST를 허용하지 않는 것입니다. 서비스를 테스트 할 수있는 더 좋은 방법이 있다면 언제든지 공유하십시오.

답변

2

다른 콘텐츠 형식을 사용할 수 있으면 json을 대신 사용할 수 있습니다.이 경우 json이 예제에서 작동합니다.

변경

webRequest.ContentType = "application/x-www-form-urlencoded"; 
byte[] bytes = Encoding.ASCII.GetBytes("username=test&fileid=1"); 

webRequest.ContentType = "application/json"; 
byte[] bytes = Encoding.ASCII.GetBytes("{\"username\":\"test\",\"fileid\":1"); 

여러 게시물과 해결 방법을 설명하는 다른 SO 질문 wcf application/x-www-form-urlencoded 구글, 응용 프로그램 /을 x-www-form-urlencoded 콘텐츠 형식을 사용해야하는 경우

합니다.

+0

모든 응용 프로그램에서 사용하기로되어 있기 때문에'application/x-www-form-urlencoded '를 사용하고있었습니다. 나는'application/json'에 대해 몰랐다. 고맙습니다. – rafale

5

이 매우 간단한 과정이지만, (WCF의 여러 측면과 불행의 경우와 같이) 설명을위한 this 후 확인하시기 바랍니다 쉽게 접근 또는 솔직하지 :

서비스 계약 :

[ServiceContract] 
public interface ISampleService 
{ 
    [OperationContract] 
    [WebInvoke(UriTemplate = "invoke")] 
    void DoWork(Stream input); 
} 

HTML 소스 :

<form method="post" action="Service.svc/invoke"> 
    <label for="firstName">First Name</label>: <input type="text" name="firstName" value="" /> 
    <br /><br /> 
    <label for="lastName">Last Name</label>: <input type="text" name="lastName" value="" /> 
    <p><input type="submit" /></p> 
</form> 

코드 뒤에 :

public void DoWork(Stream input) 
{ 
    StreamReader sr = new StreamReader(input); 
    string s = sr.ReadToEnd(); 
    sr.Dispose(); 
    NameValueCollection qs = HttpUtility.ParseQueryString(s); 
    string firstName = qs["firstName"]; 
    string lastName = qs["lastName"]; 
} 
+0

원시 POST를 허용하는 서비스를받는 것이 내 목표는 아닙니다. 나는 테스트 클라이언트에서 메소드를 호출하여 서비스를 테스트하려고하는데 실수로 POST가 그 일을 처리하는 가장 쉽고 간단한 방법이었을 것이라고 생각했다. 내 원래 게시물 OperationContract 감안할 때, 어떻게 호출해야합니까? – rafale

+0

아쉽게도 WCF는 form-url 인코딩을 지원하지 않습니다. 그래서 나는 당신을 "원시"솔루션으로 지적했다. 대신 "GET"을 사용하여 UriTemplate에서 인수 형식을 지정할 수 있습니다. – feathj

+0

단일 스트림 입력을 사용하여 WCF 서비스에 POST 할 수있는 유일한 방법은 다중 입력 매개 변수가있는 WebInvoke/POST OperationContracts 코드 예제가있는 이유는 무엇입니까? 예를 보려면 다음 링크를 참조하십시오. http://msdn.microsoft.com/en-us/library/bb628610.aspx – rafale

관련 문제