none
Como obtener los valores que se envian por POST(Content-Type"Multipart/from-data") RRS feed

  • Pregunta

  • Muy buenas tardes a todos,<o:p></o:p>

    De antemano agradezco el tiempo y la ayuda que me pueda prestar.<o:p></o:p>

    Resulta que tengo unos servicios "Restful", todos los servicios que manejo son Post y utilizar HttpResponseMessage([FromBody] JObject appParamars) hasta el momento todo funciona muy bien por que solo recibe Json, pero tengo un servicio que no recibe Json y que su content-Type = Multpar/form-data, el servicio como tal lo manejo igual que los demás que funcionan con Json: HttpResponseMessage([FromUri] ??) aquí es donde tengo el problema, no se como capturar los datos que me envían, si dejo el Jobject, este no muestra ninguno de los valores que son enviados y no sé qué más hacer para capturar lo que me envíen y con eso poder realizar mi lógica.

    Agradezco si me pueden ayudar con este tema, tengo casi todo el día revisándolo y no he podido darle solución, mil gracias y que tengan una excelente tarde.<o:p></o:p>

    jueves, 15 de octubre de 2015 22:15

Respuestas

  • Muchas gracias a todos por su colaboracion, ya encontre solucion.

    var requestClient = this.Request.Content.ReadAsMultipartAsync().Result;

    Muchas gracias !!!

    buena tarde para todos.

    viernes, 16 de octubre de 2015 19:58

Todas las respuestas

  • hola

    pero el HttpResponseMessage es para que el metodo responda, no para que reciba el archivo

    para recibirlo quizas no necesites definir un parametros, o sino ver de usar el MultipartFormDataStreamProvider

    Web API File Upload, Single or Multiple files

    Uploading files using ASP.NET Web Api

    Nota: recuerda que para asp.net mvc hay un foro concreto

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 15 de octubre de 2015 23:40
  • Hola

    Yo use Jquery File Upload

    https://blueimp.github.io/jQuery-File-Upload/

    El codigo queda facil.

    $('#fileXml').fileupload({
                dataType: 'json',
                url: '@Url.Content("~/Controlador/Accion")',
                autoUpload: true,
                done: function (e, data) {

                    alert('enviado');

                }
            }).on('fileuploadprogressall', function (e, data) {
                alert('enviando, espere');

            });

        });
       
       
        El tag de html
        <input type="file" id="fileXml" accept='application/xml' /><br />
       
    tu controlador y accion

     public JsonResult Accion()
    {
                if (Request.Files.Count > 0)
                {
                    foreach (string file in Request.Files)
                    {
                      HttpPostedFileBase hpf = Request.Files[file] as HttpPostedFileBase;
                      Stream stm=hpf.InputStream;

                     //tu codigo.

                    }
                }
            }

    Saludos

    viernes, 16 de octubre de 2015 3:11
  • Muy buenos dias!!

    De antemano les agradezco la colaboracion prestada, resulta que el servicio recibe los valores por medio del parametro que le envian, son como 5 parametros y basados en ellos, realizo mi logica y devuelvo un json con un resultado al medio que me hizo la solicitud, este seria el servicio completo.

     public HttpResponseMessage Radicado([FromUri] JObject appParameters)
            {

                // HttpPostedFileBase fileP,
                //LogonModel loggedModelUserP, string layoutIDP, List<string> recipientsP)
                try
                {
                    responseCode = HttpStatusCode.ExpectationFailed;
                    error = "";

                    if (appParameters != null)
                    {
                    dynamic jsonRepresentation = appParameters;
                    var loggedModelUser = 
                        jsonRepresentation.loggedModelUser.ToObject<LogonModel>();
                    var layoutID = jsonRepresentation.layoutID;
                    var file = jsonRepresentation.file.ToObject<HttpPostedFileBase>();
                    var recipients = jsonRepresentation.recipients.ToObject<List<string>>();
                    var loggedModelUser = loggedModelUserP as LogonModel;
                    var file = fileP;
                     var layoutID = layoutIDP;
                    var recipients = recipientsP;

                        var loggedUser = CacheManager.GetCacheObject(loggedModelUser.uniqueCode) as Logon;

                        var documentManager = new DxDocumentManager(loggedUser, "IN");
                        documentManager.currentDocument = new Document(loggedUser);
                        var target = new MemoryStream();
                        file.InputStream.CopyTo(target);
                        documentManager.currentDocument.InitDocument(
                            Path.GetFileName(file.FileName), target.ToArray());
                        documentManager.fields["HD_INCIDENT_LAYOUT_ID"].Value = Convert.ToInt32(layoutID);
                        documentManager.fields["SEND_PERSON"].Value = loggedUser.person_id;
                        documentManager.fields["RECV__PERSON"].Value =
                            Assistant.GetPerson(loggedUser, recipients);

                        var result = new JObject();
                        result.Add(documentManager.Save());
                        result.Add(documentManager.ticket.record_ID);

                        return Request.CreateResponse<JObject>(HttpStatusCode.OK, result);
                    }

                    return Request.CreateResponse<JObject>(
                       responseCode, responseError.GetJSONError(error));

                }
                catch (Exception e)
                {
                    error = InventoryExceptions.ValidateException(e, error);
                    responseCode = HttpStatusCode.InternalServerError;
                    return Request.CreateResponse<JObject>(
                        responseCode, responseError.GetJSONError(error));
                }

    viernes, 16 de octubre de 2015 12:26
  • hola

    es que para subir un archivo el JObject  no aplica

    ademas hay mejores formas que usar el JObject, model binding permite mapear con algo mas tipado

    no se como realizas desde el cliente la subida del archivo, pero quizas debas usar jquery con

    jquery.fileDownload

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 16 de octubre de 2015 13:04
  • mira la parte en la que arman todo es esta y desde aqui llaman mis servicios.

     private void SaveAndSentMail(Outlook.MailItem msg, string layoutID, List<string> recipients)
            {
                var fullPath = SAVE_FOLDER + "/" + "Mail.msg";

                if (!Directory.Exists(SAVE_FOLDER))
                {
                    Directory.CreateDirectory(SAVE_FOLDER);
                }

                msg.SaveAs(fullPath, Outlook.OlSaveAsType.olMSG);

                var bytes = File.ReadAllBytes(fullPath);

                // Generate post objects
                Dictionary<string, object> postParameters = new Dictionary<string, object>();
                postParameters.Add("fileP", new FormUpload.FileParameter(bytes, "Mail.msg", "application/vnd.ms-outlook"));
                postParameters.Add("loggedModelUserP", JsonConvert.SerializeObject(Globals.Ribbons.DexonRibbon.LogObject));
                postParameters.Add("layoutIDP", layoutID);
                postParameters.Add("recipientsP", JsonConvert.SerializeObject(recipients));

                // Create request and receive response
                string postURL = "http://localhost:11323/api/incident/Radicado";
                string userAgent = "Someone";
                HttpWebResponse webResponse = FormUpload.MultipartFormDataPost(postURL, userAgent, postParameters);

    ------------------------------------------------------------------------------------------------------------------------------------------

     public static HttpWebResponse MultipartFormDataPost(string postUrl, string userAgent, Dictionary<string, object> postParameters)
            {
                string formDataBoundary = String.Format("----------{0:N}", Guid.NewGuid());
                string contentType = "multipart/form-data; boundary=" + formDataBoundary;

                byte[] formData = GetMultipartFormData(postParameters, formDataBoundary);

                return PostForm(postUrl, userAgent, contentType, formData);
            }
            private static HttpWebResponse PostForm(string postUrl, string userAgent, string contentType, byte[] formData)
            {
                HttpWebRequest request = WebRequest.Create(postUrl) as HttpWebRequest;

                if (request == null)
                {
                    throw new NullReferenceException("request is not a http request");
                }

                // Set up the request properties.
                request.Method = "POST";
                request.ContentType = contentType;
                request.UserAgent = userAgent;
                request.CookieContainer = new CookieContainer();
                request.ContentLength = formData.Length;
                request.Accept = "application/json";

                // You could add authentication here as well if needed:
                // request.PreAuthenticate = true;
                // request.AuthenticationLevel = System.Net.Security.AuthenticationLevel.MutualAuthRequested;
                // request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(System.Text.Encoding.Default.GetBytes("username" + ":" + "password")));

                // Send the form data to the request.
                using (Stream requestStream = request.GetRequestStream())
                {
                    requestStream.Write(formData, 0, formData.Length);
                    requestStream.Close();
                }

                return request.GetResponse() as HttpWebResponse;
            }

    ellos me envia si mal no estoy un byte[] donde esta todo contenido, pero el problema es como obtener esos valores

    viernes, 16 de octubre de 2015 13:36
  • Muchas gracias a todos por su colaboracion, ya encontre solucion.

    var requestClient = this.Request.Content.ReadAsMultipartAsync().Result;

    Muchas gracias !!!

    buena tarde para todos.

    viernes, 16 de octubre de 2015 19:58