AJAX 文件上传到 WCF 服务的工作示例
Posted
技术标签:
【中文标题】AJAX 文件上传到 WCF 服务的工作示例【英文标题】:Working example of AJAX file upload to WCF service 【发布时间】:2012-11-19 14:40:43 【问题描述】:我正在寻找将流数据传输到 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 流绑定
<binding name="PublicStreamBinding"
maxReceivedMessageSize="2000000000" transferMode="Streamed">
<security mode="None" />
</binding>
我的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);
);
【问题讨论】:
【参考方案1】:我无法评论服务器端代码,但客户端:
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);
);
【讨论】:
感谢您的提示,我尝试按照您所说的那样设置数据,但我收到一条消息“传输错误::未定义”。我真的应该正确拼写错误,将修复我的帖子。 您可以在上面看到该服务已设置为 POST。你知道我怎样才能得到更有意义的错误信息吗? 我更喜欢带有三个 'r's 的“错误”——它具有一定的 je ne sait qqqouoi。要获得更有意义的错误消息,请尝试探索传递给错误处理程序的两个参数textStatus
和 errorThrown
。
在同一点上,c# 应该允许您设置 HTTP 响应标头,以便应用程序错误引发 HTTP 响应错误。这样(客户端),成功将始终在成功处理程序中结束,所有类型的错误都将在错误处理程序中结束。否则,您必须在成功处理程序中处理应用程序错误,这很混乱。我只需要在 php 中执行此操作,但无论使用哪种服务器端技术,原则都必须相同。【参考方案2】:
安装 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);
【讨论】:
以上是关于AJAX 文件上传到 WCF 服务的工作示例的主要内容,如果未能解决你的问题,请参考以下文章