httprequestmessage form example data c# dotnet-httpclient

httprequestmessage - multipart/form-data post request example c#



HttpClient Multipart Form Post en C# (3)

Entonces, el problema que estoy viendo es que el mensaje de solicitud de MultipartFormDataContent siempre establecerá el tipo de contenido de la solicitud en "multipart / form-data". Endcoding json y colocarlo en la solicitud solo "se ve" como el archivador modelo como una cadena.

Tus opciones son:

  • haga que su método de acción mvc reciba una cadena y se deserialice en su objeto
  • publicar cada propiedad de su modelo como parte de un formulario
  • crea un archivador de modelo personalizado que gestionará tu solicitud.
  • Interrumpa la operación en dos publicaciones, primero envía los metadatos json, el otro envía el archivo. La respuesta del servidor debe enviar una identificación o clave para correlacionar las dos solicitudes.

Al leer el documento de RFC y la documentación de MSDN , puede hacerlo, si reemplaza MultipartFormDataContent con MultipartContent . Pero aún no he probado esto.

Estoy intentando hacer una publicación de formulario multiparte usando HttpClient en C # y estoy descubriendo que el siguiente código no funciona.

Importante:

var jsonToSend = JsonConvert.SerializeObject(json, Formatting.None, new IsoDateTimeConverter()); var multipart = new MultipartFormDataContent(); var body = new StringContent(jsonToSend, Encoding.UTF8, "application/json"); multipart.Add(body); multipart.Add(new ByteArrayContent(File.ReadAllBytes("test.txt")), "test", "test.txt"); var httpClient = new HttpClient(); var response = httpClient.PostAsync(new Uri("http://localhost:55530"), multipart).Result;

Programa completo :

namespace CourierMvc.Worker { class Program { static void Main(string[] args) { while (true) { Console.WriteLine("Hit any key to make request."); Console.ReadKey(); try { var request = new RestRequest(Method.POST) { Resource = "http://localhost:55530" }; var json = new CourierMessage { Id = Guid.NewGuid().ToString(), Key = "awesome", From = "[email protected]", To = new[] { "[email protected]", "[email protected]" }, Subject = "test", Body = "body", Processed = DateTimeOffset.UtcNow, Received = DateTime.Now, Created = DateTime.Now, Sent = DateTime.Now, Links = new[] { new Anchor { Link = "http://google.com" }, new Anchor { Link = "http://yahoo.com" } } }; var jsonToSend = JsonConvert.SerializeObject(json, Formatting.None, new IsoDateTimeConverter()); var multipart = new MultipartFormDataContent(); var body = new StringContent(jsonToSend, Encoding.UTF8, "application/json"); multipart.Add(body); multipart.Add(new ByteArrayContent(File.ReadAllBytes("test.txt")), "test", "test.txt"); var httpClient = new HttpClient(); var response = httpClient.PostAsync(new Uri("http://localhost:55530"), multipart).Result; } catch (Exception e) { Console.WriteLine(e); } } } } }

Realmente no tengo idea de por qué no funciona. Obtengo el archivo para publicar en el punto final, pero el cuerpo (json) nunca llega allí. ¿Estoy haciendo algo mal?

Solicitud de código del lado del servidor:

namespace CourierMvc.Controllers { public class HomeController : Controller { // // GET: /Home/ public ActionResult Index() { return Content("Home#Index"); } [ValidateInput(false)] public ActionResult Create(CourierMessage input) { var files = Request.Files; return Content("OK"); } } }

Configuración de ruta:

public static void RegisterRoutes(RouteCollection routes) { routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Create", id = UrlParameter.Optional } ); }


Este es un ejemplo de cómo publicar secuencias de cadenas y archivos con HTTPClient utilizando MultipartFormDataContent. La disposición del contenido y el tipo de contenido deben especificarse para cada HTTPContent:

Aquí está mi ejemplo. Espero eso ayude:

private static void Upload() { using (var client = new HttpClient()) { client.DefaultRequestHeaders.Add("User-Agent", "CBS Brightcove API Service"); using (var content = new MultipartFormDataContent()) { var path = @"C:/B2BAssetRoot/files/596086/596086.1.mp4"; string assetName = Path.GetFileName(path); var request = new HTTPBrightCoveRequest() { Method = "create_video", Parameters = new Params() { CreateMultipleRenditions = "true", EncodeTo = EncodeTo.Mp4.ToString().ToUpper(), Token = "x8sLalfXacgn-4CzhTBm7uaCxVAPjvKqTf1oXpwLVYYoCkejZUsYtg..", Video = new Video() { Name = assetName, ReferenceId = Guid.NewGuid().ToString(), ShortDescription = assetName } } }; //Content-Disposition: form-data; name="json" var stringContent = new StringContent(JsonConvert.SerializeObject(request)); stringContent.Headers.Add("Content-Disposition", "form-data; name=/"json/""); content.Add(stringContent, "json"); FileStream fs = File.OpenRead(path); var streamContent = new StreamContent(fs); streamContent.Headers.Add("Content-Type", "application/octet-stream"); streamContent.Headers.Add("Content-Disposition", "form-data; name=/"file/"; filename=/"" + Path.GetFileName(path) + "/""); content.Add(streamContent, "file", Path.GetFileName(path)); //content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment"); Task message = client.PostAsync("http://api.brightcove.com/services/post", content); var input = message.Result.Content.ReadAsStringAsync(); Console.WriteLine(input.Result); Console.Read(); } } }


public class CourierMessage { public string Id { get; set; } public string Key { get; set; } public string From { get; set; } public string Subject { get; set; } public string Body { get; set; } public DateTimeOffset Processed { get; set; } public DateTime Received { get; set; } public DateTime Created { get; set; } public DateTime Sent { get; set; } public HttpPostedFileBase File { get; set; } } while (true) { Console.WriteLine("Hit any key to make request."); Console.ReadKey(); using (var client = new HttpClient()) { using (var multipartFormDataContent = new MultipartFormDataContent()) { var values = new[] { new KeyValuePair<string, string>("Id", Guid.NewGuid().ToString()), new KeyValuePair<string, string>("Key", "awesome"), new KeyValuePair<string, string>("From", "[email protected]") //other values }; foreach (var keyValuePair in values) { multipartFormDataContent.Add(new StringContent(keyValuePair.Value), String.Format("/"{0}/"", keyValuePair.Key)); } multipartFormDataContent.Add(new ByteArrayContent(File.ReadAllBytes("test.txt")), ''"'' + "File" + ''"'', ''"'' + "test.txt" + ''"''); var requestUri = "http://localhost:5949"; var result = client.PostAsync(requestUri, multipartFormDataContent).Result; } } }