2016-04-29 2 views
0

У меня здесь небольшая проблема.Отправить файл с дополнительными параметрами в службу WCF REST

В настоящее время я использую общий обработчик для загрузки файлов на сервер, но одна из проблем, которые у меня есть, заключается в том, что если у меня есть дополнительные данные, такие как имя пользователя и фамилия, я должен сделать (сохранить) это отдельно.

Это проблема, потому что, если я сохраню имя и фамилию и не удастся загрузить файл, у меня есть запись в моей базе данных, у которой нет файла, связанного с ним.

Итак, теперь я собираюсь внедрить новый веб-метод, который займет все это, и если этот метод завершится неудачно, он просто откатит транзакцию SQL.

Что я хочу сделать, это вызвать веб-метод и передать файл с именем пользователя и фамилией и фотографией, а затем выполнить сохранение в базе данных.

Это то, что я пробовал:

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

Однако я терпеть неудачу ,

Веб-служба вызывается, но все переменные имеют значение NULL.

Если я собираюсь сделать это неправильно, укажите мне в правильном направлении - любая помощь будет оценена!

(Если что-то не ясно, пожалуйста, спросите, и я постараюсь объяснить более)

+0

попробуйте установить 'BodyStyle' на' Bare'. –

+0

Просто попробовал - он все еще не получает переменные значения :( –

ответ

0

Ах, независимо от того, я изменил свой подход. Вместо того, чтобы пытаться использовать веб-службу, я теперь использую Generic Handler для этого.

Иногда лучше смотреть на него немного иначе. Вот как я заставил это работать для меня.

В моей 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); 
     } 
    } 

Конечно, это простой пример того, что Я сделал ... но я счастлив сделать это таким образом.

Смежные вопросы