Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/328.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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# 有多少种不同的方法可以通过HTTP GET传递参数?_C#_.net_Http_Asp.net Web Api - Fatal编程技术网

C# 有多少种不同的方法可以通过HTTP GET传递参数?

C# 有多少种不同的方法可以通过HTTP GET传递参数?,c#,.net,http,asp.net-web-api,C#,.net,Http,Asp.net Web Api,通常,如果我使用HTTPClient并发出GetAsync(URI)或类似命令,如果我想传递一些参数,如“int-id、string-name、string-division”,我需要将它们附加到URI:”http://localhost/webapplication/api/controller/action/id“ 他们是否有其他方法可以替代这种传递参数的标准方法,从而使信息在uri中不正确 类似于HTTPClient.MessageParameters=myOBject的东西放在消息体中,

通常,如果我使用HTTPClient并发出GetAsync(URI)或类似命令,如果我想传递一些参数,如“int-id、string-name、string-division”,我需要将它们附加到URI:
”http://localhost/webapplication/api/controller/action/id“

他们是否有其他方法可以替代这种传递参数的标准方法,从而使信息在uri中不正确

类似于
HTTPClient.MessageParameters=myOBject
的东西放在消息体中,然后我可以在另一侧解包

如果没有替代方案,使用POST隐藏参数是否是一种可接受的方法


谢谢

您至少有两种选择:

  • 添加包含数据的自定义http头
例如

X-Var-Count:3
X-Var-Name-1:id
X-Var-Value-1:
X-Var-Name-2:名称
X-Var-Value-2:
X-Var-Name-3:分部
X-Var-Value-3:
显然,这需要额外的服务器端处理

  • 切换到POST请求

使用POST是隐藏这些参数的公认方式,如果执行请求有副作用,则它们肯定应该在POST请求中提交。GET请求可能会被代理缓存,或者在缓存过程中被缓存到其他地方,这可能会给您带来问题。我认为从理论上讲,您可以尝试更改请求头,但不能保证如果它们是非标准的,服务器不会删除它们,因此您不应该研究该选项


编辑:有关X-Header(非标准HTTP头)以及是否可以安全使用它们的更多信息,请参阅。看来他们现在已经被弃用了。

我想发一篇帖子

通过GET传递的任何参数都可以由代理捕获和记录,或者缓存在服务器日志中

HttpWebRequest httpWReq =
(HttpWebRequest)WebRequest.Create("http://domain.com/page.aspx");

ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "username=user";
postData += "&password=pass";
byte[] data = encoding.GetBytes(postData);

httpWReq.Method = "POST";
httpWReq.ContentType = "application/x-www-form-urlencoded";
httpWReq.ContentLength = data.Length;

using (Stream stream = httpWReq.GetRequestStream())
{
    stream.Write(data,0,data.Length);
}

HttpWebResponse response = (HttpWebResponse)httpWReq.GetResponse();

string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
有关代码,请参见:


有关推理,请参阅:

可以通过向url添加一个带有随机生成值的伪参数来避免缓存。当然可以,但既然已经有一个HTTP谓词用于此目的,为什么要这样做呢?我想这取决于您的应用程序。组装POST请求可能会很麻烦,更重要的是,有时需要在url中包含参数(例如,触发url重写或通过代理发送请求)。感谢链接到X-headers rfc。我不明白他们的道理。引用自:
2。应该使用他们有理由相信当前未使用的有意义的参数名称;3.不应在其参数名称前加上“X-”或类似结构。
。因此,我使用带有
X-
的标题来表示有意义的名称所建议的语义+该标题未被官方标准维护机构分配或注册的信息。@collapsar,谁说您不能在URL中包含带有POST请求的参数?没有什么能阻止您这样做,大多数REST服务似乎都能做到这两个方面。
HttpWebRequest httpWReq =
(HttpWebRequest)WebRequest.Create("http://domain.com/page.aspx");

ASCIIEncoding encoding = new ASCIIEncoding();
string postData = "username=user";
postData += "&password=pass";
byte[] data = encoding.GetBytes(postData);

httpWReq.Method = "POST";
httpWReq.ContentType = "application/x-www-form-urlencoded";
httpWReq.ContentLength = data.Length;

using (Stream stream = httpWReq.GetRequestStream())
{
    stream.Write(data,0,data.Length);
}

HttpWebResponse response = (HttpWebResponse)httpWReq.GetResponse();

string responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();