-1

我收到以下异常:

System.ArgumentException

   at Microsoft.AspNet.Http.PathString..ctor(String value)
   at Microsoft.AspNet.Http.Internal.DefaultHttpRequest.get_Path()
   at Microsoft.AspNet.StaticFiles.Helpers.TryMatchPath(HttpContext context,   PathString matchUrl, Boolean forDirectory, PathString& subpath)

the Request METHOD is GET
 HTTP Version HTTP/1.1
Content-Type : application/x-www-form-urlencoded
Accept-Encoding : {gzip}

任何帮助,将不胜感激。

public Startup(IHostingEnvironment env)
{
    // Set up configuration sources.
    var builder = new ConfigurationBuilder()
        .AddJsonFile("appsettings.json")
        .AddJsonFile("XDCRInfo.json")
        .AddEnvironmentVariables();
    Configuration = builder.Build();
}

public void ConfigureServices(IServiceCollection services)
{
    var policy = new Microsoft.AspNet.Cors.Infrastructure.CorsPolicy();

    policy.Headers.Add("*");
    policy.Methods.Add("*");
    policy.Origins.Add("*");
    policy.SupportsCredentials = true;

    services.Configure<XDCRSettings>(Configuration.GetSection("XDCRSettings"));

    // Adding Cors
    services.AddCors(options =>
    {
        options.AddPolicy("CrossOrigin", policy);
    });

    // Add framework services.
    services.AddMvc();            

    services.Configure<MvcOptions>(options =>
    {
        options.RespectBrowserAcceptHeader = true;
    });
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseExceptionHandler("/Home/Error");

    app.Use(next => async context => 
        // Keep the original stream in a separate
        // variable to restore it later if necessary.
        var stream = context.Request.Body;

        // Optimization: don't buffer the request if
        // there was no stream or if it is rewindable.
        if (stream == Stream.Null || stream.CanSeek)
        {
            await next(context);
            return;
        }

        try
        {
            using (var buffer = new MemoryStream())
            { 
                // Copy the request stream to the memory stream.
                await stream.CopyToAsync(buffer);

                // Rewind the memory stream.
                buffer.Position = 0L;

                // Replace the request stream by the memory stream.
                context.Request.Body = buffer;

                // Invoke the rest of the pipeline.
                await next(context);
            }
        }
        catch (System.ArgumentException ex)
        {
            var Frame = (Microsoft.AspNet.Server.Kestrel.Http.Frame)context.Features;

            Console.WriteLine(Frame.RequestUri);
        }
        finally
        {
            // Restore the original stream.
            context.Request.Body = stream;
            Console.WriteLine(context.Request);
        }
    });

    app.UseCors("CrossOrigin");

    app.UseMvc();
}

App.use用于捕获错误。否则我无法看到请求。

4

1 回答 1

0

我已经想通了。如果 AbsoluteURL 在路径中,Kestrel 将中断。为了使它工作,这是解决方法

        app.Use(next => async context => {

                     // get the frame from kestrel and then but the path by removing the hostname 
                    var Frame = (Microsoft.AspNet.Server.Kestrel.Http.Frame)context.Features;

                    var newpath = Frame.RequestUri.Replace("http://" + context.Request.Host.Value, "");
                    context.Request.Path = newpath;

                    // Invoke the rest of the pipeline.
                    await next(context);

        });
于 2016-04-06T21:06:29.407 回答