我正在尝试将文件上传到WCF服务。这是我的ajax帖子。
$.ajax({
cache: false,
url: "MyService.svc/UploadFile",
type: "POST",
data: document.getElementById("fileUpload1").files[0],
processData: false
});
ID为fileUpload1的元素只是"输入"的类型的普通元素。
这是我的WCF操作。
接口:
[OperationContract]
[WebInvoke(Method = "POST")]
ScriptResult UploadFile(Stream stream);
实现:
public ScriptResult UploadFile(Stream stream) {
try {
var ms = new MemoryStream();
stream.CopyTo(ms);
File.WriteAllBytes(@"C:\Folder1\somefilename.someExtension", ms.ToArray());
return Result("OK");
} catch (Exception e) {
Logger.Error(e);
return Error(e);
}
}
上述解决方案可以正常工作,除了两件事:
上次调用UploadFile方法不止一次,这意味着文件会被覆盖X次。要保存的文件的最后一个版本是完全有效的(只要我手动将文件的扩展名更改为实际文件类型)。调用该方法的次数取决于我选择上传哪个文件。也许它与文件的大小有关 - 也许不是。我还没有能够在这种行为中找到任何模式,但所有调用肯定都包含完整且有效的Stream。
任何人都知道为什么这样做?对我来说完全是无稽之谈。我尝试使用WebInvoke属性以不同的方式装饰interface-method,如在Google上描述的许多地方,并在ajax-call中将内容类型设置为json,xml和whatnot,但唯一的组合使它一直到service-method是保留内容类型未指定(或设置为" false")。
我试过这个:WCF service multiple method calls one ajax request没有运气。
我考虑过在调用方法之后我是否与处理流的方式有关(比如你不读取流中的所有数据,那么WCF可能&#34提供"它再次将该方法作为完全清空它的机会,但它是一个很长的镜头并且没有工作)。
有什么想法吗?提前谢谢。
答案 0 :(得分:0)
除了直接执行服务外,您还可以在诸如SOAP UI或Postman之类的工具上进行测试,这些工具具有的属性仅在您调用时才被调用一次,而不是通过浏览器对调用方法n拥有自己的属性进行测试,但没有时间可以得到任何响应
因此您可以使用工具然后实施。
我多次面对这些问题。