将带有额外参数的文件发送到WCF REST服务

时间:2016-04-29 13:45:48

标签: c# jquery web-services wcf-rest

我在这里遇到一些问题。

目前我正在使用Generic Handler将文件上传到服务器,但我遇到的一个问题是,如果我有额外的数据,比如用户的名字和姓氏,我必须这样做(保存)分开。

这是一个问题,因为如果我保存名称和姓氏,并且文件上传失败,我的数据库中有一条没有与之关联的文件的记录。

所以,现在我正在考虑实现一个新的Web方法,这将采取所有这些,如果该方法失败,它将只回滚SQL事务。

我想要做的是调用Web方法,并使用用户的姓名和照片传递该文件,然后在那里执行保存。

这就是我的尝试:

jQuery的:

$("#btnCreateRequest").click(function () {
    var data = new FormData();
    var photo = $("#fuPhoto")[0].files[0];

    data.append("name", 'Fred');
    data.append("surname", 'Moller');
    data.append("photo", photo);

    $.ajax({
        type: "POST",
        url: "Service.svc/CreateRequest",
        dataType: "json",
        //cache: false,
        contentType: false,
        processData: false,
        data: data,
        success: function (response2) {
            //$("#PageArea").html(response2);
            Popup(true, "success", "success", true);
        },
        error: function (response) {
            Popup(true, "Error", JSON.stringify(response), true);
        }
    });
});

IService.cs

[OperationContract]
[WebInvoke(Method = "POST",
    UriTemplate = "CreateRequest",
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.WrappedRequest)]
string CreateRequest();

Service.svc

public string CreateRequest()
{
    var request = System.Web.HttpContext.Current.Request;

    string name = request["name"];
    string surname = request["surname"];
    HttpPostedFile photo = request["photo"];

    //Saving in database happens here, using above variables...

    return "whatever";
}

然而,我失败了。

调用Web服务,但所有变量都为NULL。

如果我以错误的方式解决这个问题,请指出我正确的方向 - 任何帮助将不胜感激!

(如果问题不明确,请询问,我会尝试解释更多)

1 个答案:

答案 0 :(得分:0)

啊,不管怎样,我改变了方法。我现在使用Generic Handler而不是尝试使用Web服务。

有时,最好稍微看一下它。 以下是我为此工作的方法。

在我的jQuery中,我会有类似的东西:

$("#btnCreateRequest").click(function () {
        var data = new FormData();
        var photo = $("#fuPhoto")[0].files[0];

        data.append("callingFromPage", "help");
        data.append("requestType", $('#dropBugType').val());
        data.append("description", $('#taDescription').val());
        data.append("photo", photo);
        data.append("userGUID", _cookieObject.UserObject.GlobalUniqueID);

        $.ajax({
            xhr: function () {
                var xhr = new window.XMLHttpRequest();
                xhr.upload.addEventListener("progress", function (evt) {
                    if (evt.lengthComputable) {
                        var percentComplete = evt.loaded / evt.total;
                        percentComplete = parseInt(percentComplete * 100);
                        //Indicate progress.
                        $('.uplPhotoProgress').css('width', percentComplete + '%');
                        $('.uplPhotoProgress').html('Uploading: ' + percentComplete + '%');
                        //Hide progress bar.
                        if (percentComplete === 100) {
                            $//('.uplProgressAttachments').css('display', percentComplete + 'none');
                        }

                    }
                }, false);
                return xhr;
            },
            url: "UploadHandler.ashx/",
            data: data,
            processData: false,
            contentType: false,
            type: "POST",
            success: function (response) {
                if (response === 'success') {
                    console.log('success');
                } else {
                    console.log('problem...');
                }
            },
            error: function (response) {

            }
        });
    });

然后,在我的UploadHandler.ashx(Generic Handler)中:

public void ProcessRequest(HttpContext context)
    {
        context.Response.ContentType = "multipart/form-data";
        context.Response.Expires = -1;
        try
        {
            string callingFromPage = context.Request["callingFromPage"];
            if (!string.IsNullOrWhiteSpace(callingFromPage))
            {
                switch (callingFromPage)
                {
                    case "help":
                        {
                            string requestType = context.Request["requestType"];
                            string description = context.Request["description"];
                            HttpPostedFile photo = context.Request.Files[0];
                            string guid = context.Request["userGUID"];
                            //DO YOUR STUFF >>>
                            context.Response.Write("success");
                            break;
                        }
            }
        }
        catch (Exception ex)
        {
            context.Response.Write("Error: " + ex.Message);
        }
    }

当然,这是我所做的一个简单例子......但我很乐意这样做。