2016-04-29 16 views
0

Ich habe ein kleines Problem hier.Datei mit zusätzlichen Parametern an WCF REST senden Service

Derzeit verwende ich einen Generic Handler, um Dateien auf den Server hochzuladen, aber ein Problem, das ich habe, ist, dass ich, wenn ich zusätzliche Daten habe, den Namen und Nachnamen eines Benutzers tun muss.

Dies ist ein Problem, weil, wenn ich den Namen und Nachnamen speichern, und der Dateiupload fehlschlägt, habe ich einen Datensatz in meiner Datenbank, die keine Datei zugeordnet hat.

So, jetzt denke ich über die Implementierung einer neuen Web-Methode, die all dies übernehmen wird, und wenn diese Methode fehlschlägt, wird nur die SQL-Transaktion zurückgesetzt.

Ich möchte eine Webmethode aufrufen, die Datei mit dem Vor- und Nachnamen des Benutzers und dem Foto übergeben und dann das Speichern in der Datenbank ausführen.

Dies ist, was ich versucht habe:

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

Ich bin jedoch kläglich scheitert .

Der Webdienst wird aufgerufen, aber alle Variablen sind NULL.

Wenn ich das falsch mache, bitte zeigen Sie mir in die richtige Richtung - jede Hilfe wird geschätzt!

(Wenn etwas nicht klar ist, bitte fragen, und ich werde versuchen, mehr zu erklären)

+0

versuchen Sie, den 'BodyStyle' auf' Bare' zu ​​stellen. –

+0

Habe es gerade versucht - es bekommt immer noch nicht die variablen Werte :( –

Antwort

0

Ah, egal, ich habe meinen Ansatz geändert. Anstatt zu versuchen, einen Web Service zu benutzen, benutze ich jetzt den generischen Handler dafür.

Manchmal ist es besser, es ein wenig anders zu betrachten. So habe ich das für mich arbeiten lassen.

In meinem jQuery, werde ich so etwas wie diese:

$("#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) { 

      } 
     }); 
    }); 

Dann in meinem 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); 
     } 
    } 

Sicher, dies ist ein einfaches Beispiel dafür, was Ich habe ... aber ich bin froh, es so zu machen.

Verwandte Themen