2016-09-30 72 views
1

我正在嘗試將一些cURL命令轉換爲C#實現,但是我遇到了一個我無法解決的異常。將cURL轉換爲HttpClient.PutAsync

我試圖收集儘可能多的信息,希望有人能夠進一步幫助我。這裏有雲......

捲曲聲明:

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

C#版本:

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

C#版本導致WebException

的HResult = -2146233088

消息=遠程e名稱無法解析:'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

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 \ ñ

VS

  • 的Content-Length:0 \ r \ n
  • 連接:Keep-Alive \ r \ n

我對REST編程的經驗很少,而且對分析Web請求的知識還不夠。一些幫助/指導/解釋將不勝感激。

只是爲了完整性:

  • 是的,我知道有Windows可執行文件的捲曲,但我對樹莓PI/Windows的物聯網運行。據我所知,沒有任何針對特定平臺(還)
  • 在我離開了ip地址/應用程序的名字/等故意只是爲了安全起見WRT安全上述表述的問題

回答

1

我發現了唯一出錯的是在C#中讀取響應。通過Wireshark監視的HTTP響應是相同的(使用cURL.exe並在C#中使用PutAsync)。

我能夠忽略重定向,並有機會自己處理響應。

所以禁用自動重定向(和處理自己的反應)解決我的問題:

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