2016-09-30 15 views
1

私はいくつかのcURLコマンドをC#の実装に変換しようとしていますが、解決できない例外が発生しています。cURLをHttpClient.PutAsyncに変換する

誰かが私をさらに助けてくれることを期待してできる限り多くの情報を集めようとしました。ここでは...行く

cURLの声明:

curl -i -X PUT "http://[ipaddress]:[port]/webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=[username]&op=CREATE" 

C#バージョン:

HRESULT = -2146233088:WebException

var response = await client.PutAsync(
    "http://[ipaddress]:[port]/webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=[username]&op=CREATE", 
    null); 

C#バージョンの結果

メッセージ=遠隔e-nameは解決できません: 'ip-172-31-9-79.eu-central-1.compute.internal'

私が接続しているサーバーはHadoopサーバーです。そのサーバーで複数のインスタンスが実行されています。したがって、ファイルを保存すると、サーバーはこのファイルが格納されているインスタンスに関する情報を返信します(このファイルに書き込むときにそのインスタンスを参照できるようになります)。

エラーメッセージに基づいて、アクセスできないIPアドレスへの何らかの参照を受けているようです(そのIPアドレスはそのHadoopサーバーの内部IPアドレスなので意味があります)

私が送信される要求の違いを見つけるために、Wiresharkのを使用

のcURLを使用して:。

Frame 57: 204 bytes on wire (1632 bits), 204 bytes captured (1632 bits) on interface 0 
Ethernet II, Src: IntelCor_da:f4:44 (fc:f8:ae:da:f4:44), Dst: AsustekC_32:7d:b0 (ac:22:0b:32:7d:b0) 
Internet Protocol Version 4, Src: 192.168.1.107, Dst: [ipaddress] 
Transmission Control Protocol, Src Port: 60454, Dst Port: 50070, Seq: 1, Ack: 1, Len: 150 
Hypertext Transfer Protocol 
    PUT /webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=hdfs&op=CREATE HTTP/1.1\r\n 
     [Expert Info (Chat/Sequence): PUT /webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=hdfs&op=CREATE HTTP/1.1\r\n] 
      [PUT /webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=hdfs&op=CREATE HTTP/1.1\r\n] 
      [Severity level: Chat] 
      [Group: Sequence] 
     Request Method: PUT 
     Request URI: /webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=hdfs&op=CREATE 
      Request URI Path: /webhdfs/v1/[appname]/staging/sensors/aap.txt 
      Request URI Query: user.name=hdfs&op=CREATE 
       Request URI Query Parameter: user.name=hdfs 
       Request URI Query Parameter: op=CREATE 
     Request Version: HTTP/1.1 
    Host: [ipaddress]:50070\r\n 
    User-Agent: curl/7.50.0\r\n 
    Accept: */*\r\n 
    \r\n 
    [Full request URI: http://[ipaddress]:50070/webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=hdfs&op=CREATE] 
    [HTTP request 1/1] 
    [Response in frame: 59] 

HttpClient使用:

を私には0
Frame 381: 209 bytes on wire (1672 bits), 209 bytes captured (1672 bits) on interface 0 
Ethernet II, Src: IntelCor_da:f4:44 (fc:f8:ae:da:f4:44), Dst: AsustekC_32:7d:b0 (ac:22:0b:32:7d:b0) 
Internet Protocol Version 4, Src: 192.168.1.107, Dst: [ipaddress] 
Transmission Control Protocol, Src Port: 60541, Dst Port: 50070, Seq: 1, Ack: 1, Len: 155 
Hypertext Transfer Protocol 
    PUT /webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=hdfs&op=CREATE HTTP/1.1\r\n 
     [Expert Info (Chat/Sequence): PUT /webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=hdfs&op=CREATE HTTP/1.1\r\n] 
      [PUT /webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=hdfs&op=CREATE HTTP/1.1\r\n] 
      [Severity level: Chat] 
      [Group: Sequence] 
     Request Method: PUT 
     Request URI: /webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=hdfs&op=CREATE 
      Request URI Path: /webhdfs/v1/[appname]/staging/sensors/aap.txt 
      Request URI Query: user.name=hdfs&op=CREATE 
       Request URI Query Parameter: user.name=hdfs 
       Request URI Query Parameter: op=CREATE 
     Request Version: HTTP/1.1 
    Host: [ipaddress]:50070\r\n 
    Content-Length: 0\r\n 
    Connection: Keep-Alive\r\n 
    \r\n 
    [Full request URI: http://[ipaddress]:50070/webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=hdfs&op=CREATE] 
    [HTTP request 1/1] 
    [Response in frame: 383] 

、唯一注目に値する(私にとって無意味な)の違いは以下のとおりです。

  • のUser-Agent:/ 7.50.0カール\ rを\ nは
  • が受け入れ:/ \ rを\ nは

  • 対のContent-Length:0 \ rをする\ nは
  • 接続:キープアライブ\私ははっきりと非常に少ないRESTプログラミングの経験、およびWeb要求を分析する上で十分な知識を持っている

のR \ nは。いくつかのヘルプ/ガイダンス/説明は非常に高く評価されます。ただ、完全性について

  • はい、私はcURLのために、Windowsの実行ファイルがあることを承知していますが、私はラズベリーPI/WindowsのIoTを上で実行します。私の知る限りでは(まだ)その特定のプラットフォーム私は意図的にちょうど安全側のWRTのセキュリティであることをIPアドレス/ APPNAMEの/ etcを残し上記の文で
  • については何もない私がいることが分かった

答えて

1

発行間違っているのはC#での応答を読むことだけです。 Wiresharkで監視されるHTTP応答は同じです(cURL.exeを使用し、C#でPutAsyncを使用)。

私はリダイレクトを無視して、自分自身で応答を処理する機会を与えられました。

だから、自動リダイレクトを無効にする(とレスポンス自分自身を扱う)は私の問題を解決しました:

var httpClientHandler = new HttpClientHandler {AllowAutoRedirect = false}; 
var client = new HttpClient(httpClientHandler);