Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将cURL转换为HttpClient.PutAsync_C#_Rest_Redirect_Httpclient - Fatal编程技术网

C# 将cURL转换为HttpClient.PutAsync

C# 将cURL转换为HttpClient.PutAsync,c#,rest,redirect,httpclient,C#,Rest,Redirect,Httpclient,我试图将一些cURL命令转换为C#实现,但遇到了一个无法解决的异常 我试图收集尽可能多的信息,希望有人能进一步帮助我。就这样 cURL语句: curl -i -X PUT "http://[ipaddress]:[port]/webhdfs/v1/[appname]/staging/sensors/aap.txt?user.name=[username]&op=CREATE" C版本: C#版本会导致WebException: HResult=-2146233088 Message=无

我试图将一些cURL命令转换为C#实现,但遇到了一个无法解决的异常

我试图收集尽可能多的信息,希望有人能进一步帮助我。就这样

cURL语句:

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

C#版本会导致
WebException

HResult=-2146233088

Message=无法解析远程名称:“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]
对我来说,唯一值得注意(但对我来说毫无意义)的区别是:

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

  • 内容长度: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);
var httpClientHandler = new HttpClientHandler {AllowAutoRedirect = false};
var client = new HttpClient(httpClientHandler);