2011-09-09 12 views
2

HTTP POSTを使用してWCFサービスを呼び出そうとしていますが、サービスは400エラーを返します。私はこれがOperationContractか、POSTをやっているかどうか分からない。これは、契約は、サーバー側で次のようになります。WCFサービスへのHTTP POST

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

そして、ここでは、私がテストコンソールアプリケーションを通じてサービスを起動しようとしている方法は次のとおりです。

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

編集:私はそれをしなければなりません私の目標はサービスをテストすることであり、生のHTTP POSTを受け入れることではないことを明確にしてください。私がサービスをテストできる良い方法があれば、気軽に共有してください。

答えて

2

他のコンテンツタイプを使用できる場合は、代わりに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'を使っていました。なぜなら、これは私がすべてのPOSTに使うと考えていたからです。私は '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

関連する問題