在URI上使用HTTP POST

时间:2011-09-06 06:28:22

标签: c# wcf http-post

我有一个RESTful WCF服务,其上传方法接受多个参数。它通过创建除URI的Stream部分之外的所有参数来实现此目的。这就是合同中的方法:

[OperationContract, WebInvoke(UriTemplate = "UploadFile?username={username}&password={password}&filename={filename}")]
bool UploadFile(string username, string password, string filename, Stream fileContents);

我还没有测试过这种方法,但假设它确实有效,那么就存在一个主要问题:密码会在地址栏中显示出来。如何隐藏这些参数,同时保持它们成为UriTemplate的一部分?我需要它们作为URI的一部分,因为这是允许我在Stream中使用其他参数的原因。

这是我尝试过的:

[OperationContract, WebInvoke(Method = "POST", UriTemplate = "UploadFile?username={username}&password={password}&filename={filename}")]
bool UploadFile(string username, string password, string filename, Stream fileContents);

这只是一个疯狂的猜测,我甚至不确定它是否有任何意义。 WCF服务启动就好了,但我还没有测试过。可以这样在URI上使用HTTP POST吗?

2 个答案:

答案 0 :(得分:1)

除非您通过HTTPS发送,否则URI将始终是公开的。

您可以在调用WCF服务之前在客户端加密密码,然后解密字符串,但我预测这可能不太理想。

通常人们会在HTTP POST请求的主体中发送它,因此它在参数列表中不可见。

答案 1 :(得分:1)

POST或GET,没关系,参数仍然会显示在URL中,你肯定不希望这样。 WCF不支持开箱即用的表单发布,但是如果你改变你的方法只接受一个Stream,你将以原始字节中的任何格式接收整个POST的主体,然后你可以自己解析。< / p>

由于您要上传表单数据(application / x-Www-form-urlencoded)和文件数据,这意味着POST实际上是多部分MIME(multipart / form-data)。假设只上传单个文件,您只需要读取Stream的前端,直到第一个边界获取可以轻松拆分的表单数据并对其值进行URL解码。然后跳过边界,Stream的其余部分将是文件数据,直到结束边界。