J'ai cette méthode API Web ASP.NET et je souhaite publier un objet et, dans le même temps, un fichier!
public async Task<IHttpActionResult> Post(Facility facility)
{
if (!ModelState.IsValid)
return BadRequest();
// Check if the request contains multipart/form-data.
if (!Request.Content.IsMimeMultipartContent())
{
throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType);
}
string root = HttpContext.Current.Server.MapPath("~/App_Data");
var provider = new MultipartFormDataStreamProvider(root);
// Read the form data.
await Request.Content.ReadAsMultipartAsync(provider);
// This illustrates how to get the file names.
foreach (MultipartFileData file in provider.FileData)
{
Trace.WriteLine(file.Headers.ContentDisposition.FileName);
Trace.WriteLine("Server file path: " + file.LocalFileName);
}
// Logic
// Login
return Ok(facilityManager.Insert(facility));
}
Et je veux l'appeler, alors j'envoie cette requête http avec fiddler:
Entête:
Content-Type: multipart/form-data; boundary=-------------------------acebdf13572468
User-Agent: Fiddler
Host: localhost:44301
Content-Length: 3279
Corps:
---------------------------acebdf13572468
Content-Disposition: form-data; name="fieldNameHere"; filename="credits.txt"
Content-Type: text/plain
<@INCLUDE *C:\Program Files (x86)\Fiddler2\credits.txt*@>
---------------------------acebdf13572468
Content-Disposition: form-data; name="facility"
Content-Type: application/json
{
"FacilityTypeId":"1"
}
---------------------------acebdf13572468--
Je reçois un code d'erreur 415 avec le texte de la réponse:
{"message": "Le type de média de l'entité de demande 'multipart/form-data' n'est pas pris en charge pour cette ressource.", "exceptionMessage": "Aucun MediaTypeFormatter n'est disponible pour lire un objet de type" Facility "à partir d'un contenu avec un type de média. 'multipart/form-data'. "," exceptionType ":" System.Net.Http.UnsupportedMediaTypeException "," stackTrace ":" sur System.Net.Http.HttpContentExtensions.ReadAsAscync [T] (contenu HttpContent, contenu Type, IEnumerable
1 formatters, IFormatterLogger formatterLogger, CancellationToken cancellationToken)\r\n at System.Net.Http.HttpContentExtensions.ReadAsAsync(HttpContent content, Type type, IEnumerable
1 formateurs, IFormatterLogger formatterLogger, CancellationToken cancelToken)\r\n à System.Web.Http.ModelBinding.FormatterParameterBinding.ReadContentAsync (demande HttpRequestMessage, Type, IEnumerable`1, format.
J'ai beaucoup cherché avant de demander mais je n'ai trouvé aucune solution. Thnaks pour aider.
MODIFIER:
Remarque: si je supprime le paramètre "facility" et laisse la méthode uniquement pour le téléchargement du fichier, cela fonctionne parfaitement, mais je souhaite publier JSON et un fichier ensemble.
"mulitpart/form-data" donc on enregistre le UploadMultipartMediaTypeFormatter
public class UploadMultipartMediaTypeFormatter : MediaTypeFormatter
{
UploadMultipartMediaTypeFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("multipart/form-data"));
}
}
* inscrivez-vous dans global.asax ou (voir code sandbox)
config.Formatters.Add(new UploadMultipartMediaTypeFormatter());
WebApi va maintenant appeler MediaTypeFormatter.ReadFromStreamAsync et nous pouvons appeler l'extension HttpContent.ReadAsMultipartAsync à partir de là.