0

When making a request to Kestrel via Fiddler, the following request succeeds.

GET http://192.168.1.148:5000/ HTTP/1.1
Host: 192.168.1.148:5000
Connection: keep-alive

When making the request thru the NETMF Emulator, the following request fails.

GET http://192.168.1.148:5000 HTTP/1.1
Host: 192.168.1.148:5000
Connection: keep-alive

This is the ASP.NET Core error message. The error appears to be about logging!

Request finished in 24788.6203ms 500
fail: Microsoft.AspNet.Server.Kestrel[13]
An unhandled exception was thrown by the application.
System.AggregateException: An error occurred while writing to logger(s).

---> System.ArgumentException: Parameter name: value

at Microsoft.AspNet.Http.PathString..ctor(String value)
at Microsoft.AspNet.Http.Internal.DefaultHttpRequest.get_Path()
at Microsoft.AspNet.Hosting.Internal.HostingLoggerExtensions
    .HostingRequestStarting.ToString()
at Microsoft.Extensions.Logging.Console.ConsoleLogger.Log(
    LogLevel logLevel, Int32 eventId, Object state, 
    Exception exception, Func`3 formatter)
at Microsoft.Extensions.Logging.Logger.Log(
    LogLevel logLevel, Int32 eventId, Object state, 
    Exception exception, Func`3 formatter)

--- End of inner exception stack trace ---

at Microsoft.Extensions.Logging.Logger.Log(
    LogLevel logLevel, Int32 eventId, Object state, 
    Exception exception, Func`3 formatter)
at Microsoft.AspNet.Hosting.Internal.HostingLoggerExtensions
    .RequestStarting(ILogger logger, HttpContext httpContext)
at Microsoft.AspNet.Hosting.Internal.HostingEngine
    .<>c__DisplayClass32_0.<<Start>b__0>d.MoveNext()

--- End of stack trace from previous location where exception was thrown ---

at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter
    .HandleNonSuccessAndDebuggerNotification(Task task)
at Microsoft.AspNet.Server.Kestrel.Http.Frame
    .<RequestProcessingAsync>d__79.MoveNext()

---> (Inner Exception #0) System.ArgumentException: Parameter name: value

at Microsoft.AspNet.Http.PathString..ctor(String value)
at Microsoft.AspNet.Http.Internal.DefaultHttpRequest.get_Path()
at Microsoft.AspNet.Hosting.Internal.HostingLoggerExtensions
    .HostingRequestStarting.ToString()
at Microsoft.Extensions.Logging.Console.ConsoleLogger.Log(
    LogLevel logLevel, Int32 eventId, Object state, 
    Exception exception, Func`3 formatter)
at Microsoft.Extensions.Logging.Logger.Log(
    LogLevel logLevel, Int32 eventId, Object state, 
    Exception exception, Func`3 formatter)<---

This is the entire ASP.NET Core program.

using System;
using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;
using Microsoft.Extensions.Logging;

namespace EmptyApplication01
{
    public class Startup
    {
        public void Configure(
            IApplicationBuilder app, 
            ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(minLevel: LogLevel.Verbose);

            app.Run(async (context) =>
            {
                var logger = loggerFactory.CreateLogger("CatchAll");
                logger.LogInformation(DateTime.Now.ToString());

                await context.Response.WriteAsync("head, body");
            });
        }
    }
}
DavidG
  • 113,891
  • 12
  • 217
  • 223
Shaun Luttin
  • 133,272
  • 81
  • 405
  • 467

2 Answers2

1

I have figured out. Kestrel will break if the AbsoluteURL is in the path. in order to make it work this is the work around

    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);

    });
0

Turning off logging fixed the problem. This is probably a bug in the ASP.NET logging implementation.

using Microsoft.AspNet.Builder;
using Microsoft.AspNet.Http;
using System;

namespace EmptyApplication01
{
    public class Startup
    {
        public void Configure(IApplicationBuilder app)
        {
            app.Run(async (context) =>
            {
                // no more logging!
                System.Console.WriteLine(DateTime.Now.ToString());
                await context.Response.WriteAsync("head, body");
            });
        }
    }
}
Shaun Luttin
  • 133,272
  • 81
  • 405
  • 467
  • I'd be tempted to say it's a Kestrel bug (trying to create a `PathString` with an empty string is not a legal operation). You should be able to confirm it using by trying to access `context.Request.Path` from your inline middleware. – Kévin Chalet Feb 18 '16 at 23:02
  • Okay. Will do. Now, why would Kestrel work with a request from Firefox and Fiddler but not from NETMF's emulator? – Shaun Luttin Feb 18 '16 at 23:06
  • There's no trailing slash at the end of the URI used in the NETMF request. – Kévin Chalet Feb 18 '16 at 23:10