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); } }