2011-07-01 13 views
0

私のWebサービスに投稿しようとしたときに誰かがhttp 400エラーを表示する理由を誰にも説明できますか?webserviceから400エラー

マイサービス契約::

[ServiceContract] 
public interface IfldtWholesaleService { 
    [OperationContract] 
    [WebInvoke(Method = "POST", 
     ResponseFormat = WebMessageFormat.Xml, 
     BodyStyle = WebMessageBodyStyle.Wrapped, 
     UriTemplate = "MAC")] 
    string MAC(string input); 

マイコール。

private void postToWebsite() 
    { 
     HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(txtUrl.Text); 
     req.Method = "POST"; 
     req.MediaType = "text/xml"; 


     string input = "dfwa"; 
     req.ContentLength = ASCIIEncoding.UTF8.GetByteCount(input); 

     StreamWriter writer = new StreamWriter(req.GetRequestStream()); 
     writer.Write(input); 
     writer.Close(); 
     var rsp = req.GetResponse().GetResponseStream(); 

     txtOut.Text = new StreamReader(rsp).ReadToEnd(); 
    } 

私のサーバーの設定ファイル

<system.serviceModel> 
    <services> 
     <service name="fldtRESTWebservice.fldtWholesaleService" behaviorConfiguration="httpBehaviour"> 
      <endpoint address="" binding="webHttpBinding" contract="fldtRESTWebservice.IfldtWholesaleService" behaviorConfiguration="httpEndpointBehavour"> 
       <identity> 
        <dns value="localhost"/> 
       </identity> 
      </endpoint> 
      <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      <host> 
       <baseAddresses> 
        <add baseAddress="http://localhost:8080/ContactService/"/> 
       </baseAddresses> 
      </host> 
     </service> 
    </services> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="httpBehaviour"> 
       <serviceMetadata httpGetEnabled="True"/> 
       <serviceDebug includeExceptionDetailInFaults="False"/> 
      </behavior> 
     </serviceBehaviors> 
     <endpointBehaviors> 
      <behavior name="httpEndpointBehavour"> 
       <webHttp/> 
      </behavior> 
     </endpointBehaviors> 
    </behaviors> 
</system.serviceModel> 

EDIT ::それはまたのMediaType "text/plainの"

+0

"ASCIIEncoding.UTF8"は使用しないでください。 "Encoding.UTF8"を使用してください。 (ASCIIとUTF8は同じではありませんが、そのコードは使えますが、実際には使用しないでください) –

+0

クライアントとサーバーの両方から適切な設定セクションを共有してください。 –

+0

私はサーバーの設定ファイルを追加しました。プロジェクトのデフォルトappconfig以外のものはありません –

答えて

1

エンドポイントは、XMLやJSON形式のいずれかで要求を受け入れます。そして、あなたが送るXMLは、サービスが期待しているものと一致する必要があります。以下のコードは、あなたのサービスが期待する要求を送信します。また、MediaTypeではなく、Content TypeプロパティをHttpWebRequestに設定する必要があることに注意してください。

public class StackOverflow_6550019 
{ 
    [ServiceContract] 
    public interface IfldtWholesaleService 
    { 
     [OperationContract] 
     [WebInvoke(Method = "POST", 
      ResponseFormat = WebMessageFormat.Xml, 
      BodyStyle = WebMessageBodyStyle.Wrapped, 
      UriTemplate = "MAC")] 
     string MAC(string input); 
    } 

    public class Service : IfldtWholesaleService 
    { 
     public string MAC(string input) 
     { 
      return input; 
     } 
    } 

    private static void postToWebsite(string url) 
    { 
     HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); 
     req.Method = "POST"; 
     req.ContentType = "text/xml"; 

     string input = @"<MAC xmlns=""http://tempuri.org/""><input>hello</input></MAC>"; 

     StreamWriter writer = new StreamWriter(req.GetRequestStream()); 
     writer.Write(input); 
     writer.Close(); 
     var rsp = req.GetResponse().GetResponseStream(); 

     Console.WriteLine(new StreamReader(rsp).ReadToEnd()); 
    } 

    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service/"; 
     WebServiceHost host = new WebServiceHost(typeof(Service), new Uri(baseAddress)); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     // To find out the expected request, using a WCF client. Look at what it sends in Fiddler 
     var factory = new WebChannelFactory<IfldtWholesaleService>(new Uri(baseAddress)); 
     var proxy = factory.CreateChannel(); 
     proxy.MAC("Hello world"); 

     postToWebsite(baseAddress + "/MAC"); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
+0

あなたは星です!どのようにxmlの正しい形式を教えてくれますか? –

+0

リクエストボディスタイルは* Wrapped *であるため、外側の要素は操作名(契約の名前空間)です。パラメータの名前とともに各パラメータに1つの要素が必要です。 – carlosfigueira

+0

期待される要求を見つけるもう1つの方法は、同じ契約(およびバインディング/ビヘイビアー)でWCFクライアントを使用してサービスに要求を送信し、Fiddlerで送信する内容を確認することです。私はこのオプションでも答えを更新しました。 – carlosfigueira

3

を使用すると、あなたのコンテンツタイプがtext/xmlのが、あなたの実際のときに同じエラーを与えます内容はちょうど "dfwa"です。これは有効なXML文書ではありません。デフォルトでwebHttpBinding/webHttp行動と

(あなたはまた、方法によってreq.GetResponse()ためusingブロックを使用する必要があります。)

+0

プレーンテキストへの変更はありませんでした –

+0

@Tom:私の推測によれば、Webサービスは* XMLやおそらくフォームエンコードされたデータかもしれません。私は、入力パラメータの値にすぎない身体を手に入れることができるとは思っていません。 –

+0

ちょうどシリアル化されたオブジェクトの送信と受信を試みました。まだ血まみれ400を与える –