2016-01-15 6 views
6

Please note: As the answer shows this problem is specific for ASP.Net Core Release Candidate 1.ASP.Net Nucleo RC1: System.ArgumentException: Caratteri non validi nel percorso

in ASP.Net Nucleo/MVC 6 accesso alla URL http://localhost:58000/Admin/RebuildIndex/AspNetUserRoles/PK_IdentityUserRole%3Cstring%3E

dà questo errore:

System.ArgumentException: Illegal characters in path.
   at System.IO.Path.CheckInvalidPathChars(String path, Boolean checkAdditional)
   at System.IO.Path.GetExtension(String path)
   at Microsoft.AspNet.StaticFiles.FileExtensionContentTypeProvider.TryGetContentType(String subpath, String& contentType)
   at Microsoft.AspNet.StaticFiles.StaticFileContext.LookupContentType()
   at Microsoft.AspNet.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
   at Microsoft.AspNet.IISPlatformHandler.IISPlatformHandlerMiddleware.d__8.MoveNext()

Questo è dovuto ai caratteri <e> nell'URL. Se accedo a una pagina diversa come http://localhost:58000/Admin/RebuildIndex/AspNetRoles/RoleNameIndex, allora funziona bene.

Il mio percorso è questo:

sguardi
app.UseMvc(routes => 
{ 
    // Area route 
    routes.MapRoute(name: "areaRoute", 
     template: "{area:exists}/{controller}/{action}", 
     defaults: new { controller = "Home", action = "Index" }); 

    // Default route 
    routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}"); 
}); 

E il controller io sono l'accesso come questo:

[Route("Admin")] 
public class AdminController : Controller 
{ 
    [Route("RebuildIndex/{tableName}/{indexName}")] 
    [HttpGet] 
    [Authorize(Roles="Admin")] 
    public async Task<IActionResult> RebuildIndex(string tableName, string indexName) 
    { 
     // ... 
    } 
} 

Nelle versioni precedenti di ASP.Net abbiamo usato il tag httpRuntime in web.config per rilassare le cose quando abbiamo ricevuto il messaggio "È stato rilevato un valore Request.Path potenzialmente pericoloso dal client (&)". Così ho provato quanto segue (e alcune varianti di esso) in web.config senza successo:

<system.web> 
    <httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters="" /> 
    </system.web> 

Tuttavia guardando il messaggio di errore questo errore sembra essere perché la richiesta viene gestita come un file statico invece di essere dato a un controller MVC.

Come viene risolto in ASP.Net Core?
Sarebbe bello con una soluzione permetterlo solo per un percorso particolare.

risposta

1

Questo è un problema già registrato e risolto per RC2 (che dovrebbe essere rilasciato a febbraio 2016, in base allo the roadmap).

  • Controllare il issue 82 del repository AspNet.StaticFiles.

In caso di dubbio, è possibile controllare l'ultima versione della classe FileExtensionContentTypeProvider. Vedrete che TryGetExtension non utilizza System.IO.Path.GetExtension (Hanno anche aggiunto un commento troverete molto interessante!):

public bool TryGetContentType(string subpath, out string contentType) 
{ 
    string extension = GetExtension(subpath); 
    if (extension == null) 
    { 
     contentType = null; 
     return false; 
    } 
    return Mappings.TryGetValue(extension, out contentType); 
} 

private static string GetExtension(string path) 
{ 
    // Don't use Path.GetExtension as that may throw an exception if there are 
    // invalid characters in the path. Invalid characters should be handled 
    // by the FileProviders 

    if (string.IsNullOrWhiteSpace(path)) 
    { 
     return null; 
    } 

    int index = path.LastIndexOf('.'); 
    if (index < 0) 
    { 
     return null; 
    } 

    return path.Substring(index); 
} 

Quindi credo che si può attendere che RC2 per essere rilasciato o utilizzare il clone locale del StaticFiles pronti contro termine.

+0

Grazie. Aggiunto "RC1" al titolo poiché questa domanda e risposta è specifica per RC1. Aspetterò RC2. –