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。要获得更有意义的错误消息,请尝试探索传递给错误处理程序的两个参数 textStatuserrorThrown 在同一点上,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 服务的工作示例的主要内容,如果未能解决你的问题,请参考以下文章

托管 WCF 服务

Ajax 到 WCF 服务

wcf 服务调用从角度上传图像

上传文件(图像)在实时服务器上不起作用,但在dev上工作

使用 HTML5 和/或 jQuery 将文件上传到 WCF 服务

实现启用 AJAX 的 WCF 服务 - 来自 JQuery 的调用没有响应