2017-07-07 17 views
0

フォローインドWebサービスが定義されています。C#webservice HTTP POSTを使用してバイトを送信することができません

 [WebMethod] 
     public String sendBytes(byte[] a) 
     { 
      return "good"; 
     } 

Webサービスプロキシクラスを使用して正常に呼び出すことができます。

しかし、このWebメソッドにバイナリを含むHTTP POSTを送信できません。 私はこの試み:

 try 
      { 
       HttpWebRequest request = HttpWebRequest.Create(address) as 
       HttpWebRequest; 

      request.Method = "POST"; 
      request.ContentType = "application/x-www-form-urlencoded"; 

      //request.ContentLength = 0; 


      var postData = "xxx";   

      var data = Encoding.UTF8.GetBytes(postData); 

      request.ContentLength = data.Length; 

      using (var stream = request.GetRequestStream()) 
      { 
       stream.Write(data, 0, data.Length); 
      } 
      var response = (HttpWebResponse)request.GetResponse(); 
      Console.Write("Sending request\n\n"); 
      var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 
      String x = Console.ReadLine(); 

を、私はこの

System.NullReferenceException得た:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 System.Web.Services.Protocols.HttpServerProtocol.ReadParametersでSystem.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequestの要求) でSystem.Web.Services.Protocols.ValueCollectionParameterReader.Read(NameValueCollectionのコレクション) で()

私はこのメソッドを使用して文字列を送信できますが、バイナリデータは送信できません。 WebサービスのPOSTの例の定義もまた賢明です。

http://localhost:50178/WebService1.asmx?op=sendBytes

私はこのトピックに関する任意のヘルプや提案のために感謝しています。読み込み用Thx:

編集: ありがとうございました。

私はnull例外を解決したと思う、それは私が送信している値のparamを見つけることができないため、それの原因だと思う。しかし、今私は別の問題があります:

System.ArgumentException:efをSystem.Byteに変換できません。 パラメータ名:type ---> System.FormatException:入力文字列の形式が正しくありませんでした。 System.Byte.ParseでSystem.Number.ParseInt32(Stringを、NumberStylesスタイル、のNumberFormatInfo情報)でSystem.Number.StringToNumber(文字列str、NumberStylesオプション、NumberBuffer &数、のNumberFormatInfo情報、ブールparseDecimal)で (文字列System.Web.Services.ProtocolsでSystem.Convert.ChangeType(Object値、タイプconversionType、するIFormatProviderプロバイダー) でSystem.String.System.IConvertible.ToByte(するIFormatProviderプロバイダー) sで、NumberStylesスタイル、のNumberFormatInfo情報)を 。 ScalarFormatter.FromString(String value、Type type) ---内部例外スタックトレースの末尾--- System.Web.Services.Protocols.ScalarFormatter.FromString(String value、Type type)の System.Web.Serviの ces.Protocols.ValueCollectionParameterReader.Read System.Web.Servicesで(NameValueCollectionのコレクション)System.Web.Services.Protocols.HttpServerProtocol.ReadParametersでSystem.Web.Services.Protocols.HtmlFormParameterReader.Read(HttpRequestのリクエスト) で ()

  try 
     { 
      HttpWebRequest request = HttpWebRequest.Create(address) as 
      HttpWebRequest; 

      request.Method = "POST"; 
      request.ContentType = "application/x-www-form-urlencoded"; 

      //request.ContentLength = 0; 


      var postData = "a=";   

      var data = Encoding.UTF8.GetBytes(postData); 
      byte[] bytedata = new byte[] { 0x65,0x66}; 
      request.ContentLength = data.Length + bytedata.Length; 

      using (var stream = request.GetRequestStream()) 
      { 
       stream.Write(data, 0, data.Length); 
       stream.Write(bytedata, 0, bytedata.Length); 
      } 
      var response = (HttpWebResponse)request.GetResponse(); 
      Console.Write("Sending request\n\n"); 
      var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

編集2: 私はアーロンの提案を試してみましたが、それはうまくいきませんでした.Protocols.WebServiceHandler.CoreProcessRequestは()

はここのコードです。ここ

は、編集されたコードである:

のSystem.InvalidOperationException:

 try 
     { 
      HttpWebRequest request = HttpWebRequest.Create(address) as 
      HttpWebRequest; 

      request.Method = "POST"; 
      request.ContentType = "application/octet-stream"; 

      //request.ContentLength = 0; 


      var postData = "a=";   

      var data = Encoding.UTF8.GetBytes(postData); 
      byte[] bytedata = new byte[] { 0x65,0x66}; 
      request.ContentLength = data.Length + bytedata.Length; 

      using (var stream = request.GetRequestStream()) 
      { 
       stream.Write(data, 0, data.Length); 
       stream.Write(bytedata, 0, bytedata.Length); 
      } 
      var response = (HttpWebResponse)request.GetResponse(); 
      Console.Write("Sending request\n\n"); 
      var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd(); 

次のエラーを与えた要求形式が不正です: アプリケーション/オクテットストリーム。 System.Web.Services.Protocols.WebServiceHandler.CoreProcessRequestでSystem.Web.Services.Protocols.HttpServerProtocol.ReadParametersで () ()

参考:How can I make a local file as body of an HttpWebRequest?

事は問題はパケットがうまく、私は同じエラーが出るだろうが、それはDINT形成されていなかった場合ので、私は、URLを変更してみましたです。それは私のwebserviceがどこかで間違っているかもしれませんか?

+0

https://stackoverflow.com/questions/218384/のもう一つの重複それは何ですか?私はそれをどうしたらいいのですか? –

+0

[NullPointerExceptionとは何か、それを修正するにはどうすればいいですか?](https://stackoverflow.com/questions/218384/what-is-a-nullpointerexception-and-how-do-i-fix-it) ) –

答えて

1

application/octet-streamrequest.ContentTypeを設定してみてください。このコンテンツタイプは、要求本体に任意のバイナリデータが含まれていることを通知するために使用されます。

は、HTTPはそれのメッセージにASCIIエンコーディングを使用して、テキストベースのプロトコルであることを覚えておいてください。あなたのテストデータ0x65と0x66には 'e'と 'f'があります。理由は「efをSystem.Byteに変換できません」という例外が表示される理由です。送信しようとしているバイトがASCIIにエンコードされているため、エンドポイントがバイトを待っている文字列になります。

編集:

また、multipart/form-dataリクエストを使用して試みることができます。 C#のでそれを行う方法の例はここにある:

https://gist.github.com/bgrins/1789787

参考文献:

Why Http Protocol is designed in a plain text way

Which Mime Type to use for a binary file

+0

返信ありがとう、私の編集をチェックしてください – Wingadium

+0

Doh !!!欠落している可能性があるのは、リクエストがマルチパート/フォームデータではないということです。https://stackoverflow.com/questions/16958448/what-is-http-multipart-requestこれを含めるために私の答えを編集します。フォーム本体に 'a ='をドロップしなければならないかもしれません –

関連する問題