WCF Restful Service - 在一个请求中发送包含多个字段的文件

时间:2011-07-26 06:10:24

标签: c# wcf wcf-rest

我正在开发WCF Restful Service。 WCF的一个要求是允许客户端上传图像文件和几个可能包含多个值的输入参数。

我想到了在一个请求中发送带有输入参数的文件的几种方法。我不确定最好的方法是什么。

1)接受包含多部分表单数据流的流。这种方法的一个巨大缺点是我必须编写一个多部分解析器。 (aspNetCompatibilityEnabled = “假”)

[WebInvoke (UriTemplate = "Account",Method = "POST")]
public String Account(System.IO.Stream stream) {
MultiPartParser(stream);
}

2)将文件作为流发送,并在QueryString中发送其他数据。只有这种方法的问题是值可能是多行文本数据。

[WebInvoke (UriTemplate = "Account?input1={val1}&input2={val2}",Method = "POST")]
public String Account(System.IO.Stream stream) {

}

3)将文件转换为Base64字符串并将其封装为JSON或XML,并使用其他输入参数发送。这种方法有任何限制吗?

[WebInvoke (UriTemplate = "Account",Method = "POST")]
public String Account(String ImageFile, String input1, String input2) {

}

最好的方法是什么?谢谢你的时间。

1 个答案:

答案 0 :(得分:2)

与往常一样,asnwer是“它取决于”。你提到了每种方法的优点/缺点,所以它真的取决于你的情况。

  1. Pro:文件内容未编码(即没有大小膨胀)。 Con:您需要在服务器上编写多部分解析器(并在客户端打包请求),多部分头部将为请求添加一些(通常是非重要的)开销

  2. Pro:简单,操作易于编写。 Con:可能需要对新行等字符进行URL编码;如果附加数据很大,则URI的大小限制可能是个问题

  3. Pro:无需编码,操作易于编写。 Con:由于base64编码导致的大小膨胀(您可以将参数声明为byte [],因此解码是自动完成的),客户端需要对文件内容进行编码,并包装请求中的所有参数。 / p>

  4. 还有第四个选项,即将附加参数作为HTTP标头传递。

    1. Pro:没有URI中的大小限制。 Con:参数未显式声明,需要使用WebOperationContext从头部获取它们,并且仍然需要对0x20-0x7E范围之外的字符进行URI编码