0

我正在寻找将流数据传输到 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);
    }
});
4

2 回答 2

1

我无法评论服务器端代码,但客户端:

  • data变量应该是一个普通的 javascript 对象,而不是 JSON表示
  • url不需要GetServerUrl()前缀;尝试使用前导“/”代替
  • data对于 POST 请求,在对象中包含所有参数而不是将它们附加到 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);
    }
});
于 2012-12-01T16:21:57.543 回答
0

安装提琴手 ( 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);
        }
    }
于 2015-04-14T21:36:50.690 回答