【问题标题】:Using HTTP POST on URIs在 URI 上使用 HTTP POST
【发布时间】:2011-09-06 06:28:21
【问题描述】:

我有一个 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?

【问题讨论】:

    标签: c# wcf http-post


    【解决方案1】:

    POST 或 GET,没关系,参数仍会显示在 URL 中,您绝对不希望这样。 WCF 不支持开箱即用的表单发布,但如果您将方法更改为仅采用 Stream,您将收到整个 POST 正文,其格式为原始字节格式,然后您可以自己解析。

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

    【讨论】:

    • 我可以在服务上实现它,但是对于一个简单的 HTTP 客户端将这些值编码到 Stream 中会有多复杂?与使用 MessageContracts 和 SOAP 作为上传方法相比,它会更复杂还是更简单?
    • 您拥有客户吗?您是否受限于使用 REST?如果不是,我肯定会建议使用 SOAP 并使用 MTOM 端点来发送混合消息/文件数据。
    • 我不限于 REST,目前实际上没有任何客户端应用程序。我的目标是以这样一种方式创建服务,使客户可以在除 Microsoft 之外的各种平台上使用它。我还希望上传方法可以在网页上使用。将 MTOM 端点与 SOAP 结合使用可以让我完成所有这些工作吗?另外,我是否使用 MessageContract 来发送混合的消息/文件数据?
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多