AJAX文件上传到WCF服务的工作示例
我正在寻找一个将数据流式传输到WCF服务的ajax调用示例。 我总是收到一个错误。 任何帮助赞赏,甚至链接到博客与解决方案。 这是我的WCF服务类
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)] public class Images : IImages { string IImages.UploadImage(string fileKey, Stream imageStream) { using (var fileStream = File.Create(@"Images\" + fileKey)) { imageStream.CopyTo(fileStream); } return "done"; } }
我的合同是
[OperationContract(Name = "UploadImage")] [WebInvoke(UriTemplate = "?file_key={fileKey}", Method = "POST", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] string UploadImage(string fileKey, Stream imageStream);
我有web.config流绑定
我的ajax客户端调用是这样的
var data = '{"image":"' + uri + '"}' $.ajax({ url: GetServerUrl()+"images.svc/?file_key="+options.fileKey, type: "POST", contentType: "application/json", data: data, success: function (result) { console.log("SUCCESS"); }, error: function (jqXHR, textStatus, errorThrown) { console.log("error in transfer::" + jqXHR.responceText); } });
我不能评论服务器端代码,但客户端:
-
data
变量应该是普通的javascript对象,而不是JSON表示 -
url
不应该需要GetServerUrl()
前缀; 尝试使用前导“/”代替 - 对于POST请求,在
data
对象中包含所有参数而不是将它们添加到URL(这是GET方法)更为正常。 这取决于服务器端代码的设置,但据我所知,它希望file_key
在POST中。
你应该得到这样的东西:
var data = { image: uri, file_key: options.fileKey }; $.ajax({ url: "/images.svc/",//probably type: "POST", contentType: "application/json", data: data, success: function (result) { console.log("SUCCESS"); }, error: function (jqXHR, textStatus, errorThrown) { console.log("errror in transfer::" + jqXHR.responceText); } });
安装Fiddler(www.telerik.com/fiddler)。 启动它。 进行Web服务调用。 点击Fiddler中的通话记录。 单击“原始”选项卡以获取请求和响应。 它将具有启发性,您将看到服务器和客户端之间传递的确切内容。 也许在响应中还有一些WCF故障排除数据。
另外,不要忘记在运行WCF服务的计算机上检查应用程序事件日志。 您还可以将Global.asax添加到WCF项目(如果它是一个Web项目),并将日志代码放在Application_Error方法中。 像这样的东西:
protected void Application_Error(object sender, EventArgs e) { Exception ex = Server.GetLastError(); if (ex is ThreadAbortException) { // Nothing to do here. The thread abended. } else { activityMgr.Add(System.Reflection.MethodBase.GetCurrentMethod(), ex); } }