通过一个中间件解决ASP.Net Core中Request.Body为空的问题

    在ASP.Net Core的机制中,当接收到http的头为 application/x-www-form-urlencoded 或者 multipart/form-data 时,netcore会通过 FormReader 预先解析 Request.Body 的 Form 的内容,经过 Reader 读取后 Request.Body 就会变 null,这样我们在代码中需要再次使用 Request.Body 时就会报空异常。

详见代码:https://github.com/aspnet/HttpAbstractions/blob/release/2.0/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs

如果需要在代码中再次使用 Request.Body 是数据流时,就必须开启 Request 的 Rewind 模式,这里提供了一个中间件去开启

using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Internal;

namespace Microsoft.AspNetCore.Http
{
    public class EnableRequestRewindMiddleware
    {
        private readonly RequestDelegate _next;

        public EnableRequestRewindMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext context)
        {
            context.Request.EnableRewind();
            await _next(context);
        }
    }

    public static class EnableRequestRewindExtension
    {
        public static IApplicationBuilder UseEnableRequestRewind(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<EnableRequestRewindMiddleware>();
        }
    }
}

在 Startup.cs 的 Configure 方法引用中间件即可

//引入EnableRequestRewind中间件
app.UseEnableRequestRewind(); 

另外,这个中间件已经作为 Senparc.Weixin.MP.MvcExtension 的一个组件提供,使用 Senparc Weixin SDK 的直接引入即可

https://github.com/JeffreySu/WeiXinMPSDK/pull/1131

Serenity For asp.net core项目发布后运行不正常解决

Serenity For asp.net core项目使用 dotnet publish 指令发布到iis后,使用时候报错

Script data Template.* is not found in registered script list!

解决方法:

修改 project.json 的 publishOptions 配置节 增加 "**/*.html", 项

  "publishOptions": {
			"include": [
				"wwwroot",
				"**/*.cshtml",
				"**/*.html",
				"appsettings.json",
				"web.config"
			]
  },

 

ASP.Net Core打开系统自带的日志

修改 web.config 中的配置节

<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false"/>

把 stdoutLogEnabled 的值修改为 true ,并在网站的根目录下建一个 logs 的子目录即可