簡體   English   中英

將 cURL 轉換為 HttpClient.PutAsync

[英]Translating cURL to HttpClient.PutAsync

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

我試圖收集盡可能多的信息,希望有人能進一步幫助我。 來了...

cURL 語句:

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

消息 = 無法解析遠程名稱:'ip-172-31-9-79.eu-central-1.compute.internal'

我要連接的服務器是 Hadoop 服務器。 該服務器上運行着多個實例。 因此,當我存儲文件時,服務器會回復有關存儲該文件的實例的信息(以便在我想寫入該文件時可以引用該實例)。

根據錯誤消息,它似乎收到了對其無法訪問的 IP 地址的某種引用(這是有道理的,因為該 IP 地址是該 Hadoop 服務器中的內部 IP 地址。

我使用 Wireshark 來查找發送的請求之間的差異。

使用卷曲:

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]

對我來說,唯一顯着(但對我來說毫無意義)的差異是:

  • 用戶代理: curl/7.50.0\\r\\n
  • 接受: / \\r\\n

對比

  • 內容長度: 0\\r\\n
  • 連接: 保持活動\\r\\n

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

只是為了完整性:

  • 是的,我知道 cURL 有 Windows 可執行文件,但我在 Raspberry PI/Windows IoT 上運行。 據我所知,那個特定平台沒有任何東西(還)
  • 在上面的陳述中,我故意省略了 ipaddress/appname/etc 只是為了安全方面的安全問題

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

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

因此禁用自動重定向(並自己處理響應)解決了我的問題:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM