我需要使用 WCF REST 上传两个文件。上传单个文件时,这种具有多平台支持的 WCF Restful 服务文件上传对我有用,但是当我尝试类似
[WebInvoke(Method = "POST", UriTemplate = "FileUpload/{file1Name};{file2Name}")]
它失败。所以问题是:如何将两个参数放入 Uri 中?
提前致谢, JP
我需要使用 WCF REST 上传两个文件。上传单个文件时,这种具有多平台支持的 WCF Restful 服务文件上传对我有用,但是当我尝试类似
[WebInvoke(Method = "POST", UriTemplate = "FileUpload/{file1Name};{file2Name}")]
它失败。所以问题是:如何将两个参数放入 Uri 中?
提前致谢, JP
链接问题的答案涉及上传单个文件 - 这相当简单,因为该服务将读取整个 HTTP 请求正文,并将绑定到流参数。当您处理两个(或多个文件)时,这不起作用 - 您需要一些分隔符才能知道一个文件何时结束而另一个文件何时开始。有一些媒体类型可以处理这个问题(multipart/* 是最常见的),但它们在 WCF 中不受本机支持(您要么需要创建一个自定义格式化程序来处理它,要么获取整个body 作为流并在 FileUpload 操作中拆分文件)。
现在假设您有办法在请求正文中接收两个文件,我们可以转到您的具体问题。URI 模板功能允许您传递多个参数,但它们不能位于 URI 路径的同一“部分”中。一种选择是将它们分成多个部分:
[WebInvoke(UriTemplate = "FileUpload/{file1Name}/{file2Name}")]
或为此使用查询参数:
[WebInvoke(UriTemplate = "FileUpload?file1={file1Name}&file2={file2Name}")]
那应该做的工作。另一种选择是,因为无论如何您都必须在输入流上拆分文件,所以使用一种允许您在流本身中指定名称的格式。例如,这将是一种选择:
<length of first file name, in bytes>
<first fileName>
<length of the first file, in bytes>
<bytes corresponding to the first file>
<length of second file name, in bytes>
<second fileName>
<length of the second file, in bytes>
<bytes corresponding to the second file>
00 (or any other value indicating the end of the files)
还有很多其他的(包括 multipart/*),在所有这些中,您都需要以某种方式解析输入以将多个文件分开。