J'apprends actuellement ASP.NET MVC et j'ai reçu la tâche de créer un site Web sur lequel l'utilisateur peut télécharger un fichier.
J'ai écrit le FileUploadingController suivant en tant qu'API qui, lorsque j'essaie d'appeler via un formulaire dans ma vue pour mon site Web, j'obtiens l'erreur suivante: introuvable ou n'implémente pas IController. '
Ceci est mon API pour télécharger le fichier des utilisateurs.
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Et voici mon formulaire qui appelle cette API.
<form
method ="post"
enctype="multipart/form-data"
action="https://localhost:44327/api/FileUploading/UploadFile"
>
<div>
<label for="img">Image File</label>
<input name="img" type="file"/>
</div>
<div>
<input type="submit" value="upload" />
</div>
</form>
Bien que je sache que cette méthode n'est pas la meilleure façon de le faire et que j'ai discuté avec mon tuteur de méthodes alternatives, aucun de nous ne peut travailler pourquoi cette erreur se produit (je comprends ce que signifie l'erreur, mais je suis perplexe quant à la façon de la résoudre sans adopter une approche différente), même si nous n'avons pas cherché trop longtemps.
Merci !
MODIFIER: Comme demandé, voici le contenu de mon WebApiConfig.cs
public class FileUploadingController : ApiController
{
[HttpPost]
[Route("api/FileUploading/UploadFile")]
public async Task<string> UploadFile()
{
var ctx = HttpContext.Current;
var root = ctx.Server.MapPath("~/App_Data");
var provider =
new MultipartFormDataStreamProvider(root);
try
{
await Request.Content
.ReadAsMultipartAsync(provider);
foreach (var file in provider.FileData)
{
var name = file.Headers
.ContentDisposition
.FileName;
// remove double quotes from string.
name = name.Trim('"');
var localFileName = file.LocalFileName;
var filePath = Path.Combine(root, name);
File.Move(localFileName, filePath);
}
}
catch (Exception e)
{
return $"Error: {e.Message}";
}
return "File uploaded!";
}
}
3 Réponses :
Vous ne renvoyez aucune réponse. De cette façon, votre client pense que le contrôleur n'existe pas.
Renvoyez simplement un ActionResult . Cela devrait faire l'affaire.
public class FileUploadingController : ApiController
{
[HttpPost]
[Route("api/FileUploading/UploadFile")]
public async Task<ActionResult> UploadFile()
{
var ctx = HttpContext.Current;
var root = ctx.Server.MapPath("~/App_Data");
var provider =
new MultipartFormDataStreamProvider(root);
try
{
await Request.Content
.ReadAsMultipartAsync(provider);
foreach (var file in provider.FileData)
{
var name = file.Headers
.ContentDisposition
.FileName;
// remove double quotes from string.
name = name.Trim('"');
var localFileName = file.LocalFileName;
var filePath = Path.Combine(root, name);
File.Move(localFileName, filePath);
}
}
catch (Exception e)
{
return $"Error: {e.Message}";
}
return Ok("File uploaded!"); //or return Content("File uploaded!")
}
}
J'ai essayé ceci et j'obtiens toujours la même erreur.
Si vous utilisez le routage par attributs, vous ne pouvez pas utiliser le routage conventionnel (modèle de route).
Supprimez ci-dessous et cela devrait fonctionner:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
Le
a href = "https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2#enabling- attribute-routing "rel =" nofollow noreferrer "> documentation indique que vous pouvez en combiner deux mais en voici un problème github qui dit le contraire.
Ce programme m'a été donné pour travailler à moitié terminé, donc je ne sais pas pourquoi tout WebApiConfig dit qu'il est inutilisé, en fonction de votre réponse, je suppose que cela ne devrait pas être le cas?
Nous avons résolu le problème en ajoutant
GlobalConfiguration.Configure(WebApiConfig.Register);
Au fichier Global.asax.cs.
@ Est-ce que vous essayez de publier un formulaire mais que le point de terminaison que vous essayez d'atteindre n'a aucun paramètre? Comme [FormBody] par exemple. ASP.NET peut ne pas savoir comment acheminer vers cette action dans votre contrôleur.
Votre itinéraire doit être
"https: // localhost: 44327 / FileUploading / api / FileUploading / Upl oadFile"Vous avez oublié le nom du contrôleur@Train si je mets l'itinéraire comme vous l'avez suggéré, j'obtiens une erreur 404
@nickgowdy Je ne suis pas sûr de comprendre ce que vous entendez par là, pourriez-vous clarifier?
Quel code avez-vous dans le fichier WebApiConfig.cs dans le dossier App_Start?
@KEmery quelque chose comme la tâche asynchrone publique UploadFile ([FormBody] formBody). Comme quelqu'un d'autre l'a suggéré, vérifiez peut-être que vous publiez sur le bon contrôleur.
Consultez cette page d'aide docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/...