ASP.NET Core 7.0 Web API调用.NET Framework 4.7.2 Membership遇加载异常
问题:ASP.NET Core 7.0调用.NET Framework 4.7.2 Wrapper时加载System.Web.ApplicationServices失败
场景背景
- 现有一套不可修改、无法升级的.NET Framework 4.7.2 ASP.NET WebForms站点,仅能访问其关联数据库
- 需要开发ASP.NET Core 7.0 Web API实现集中式用户管理功能
- 原站点依赖.NET Framework的
Membership类做用户管理,但ASP.NET Core 7.0未集成该类,因此创建了一个目标框架为.NET Framework 4.7.2的Wrapper项目,封装Membership.Provider.CreateUser()方法,再在Core API中引用这个Wrapper
错误信息
调试时抛出异常:
System.BadImageFormatException: 'Could not load file or assembly 'System.Web.ApplicationServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35'. Reference assemblies cannot be loaded for execution. (0x80131058) Inner Exception BadImageFormatException: Cannot load a reference assembly for execution.
已尝试的操作:确认API的bin\Debug目录存在该DLL、重启Visual Studio、清理后重建项目、手动删除bin/obj目录后重建,问题仍未解决
现有代码示例
.NET Framework 4.7.2 Wrapper项目代码
using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; using System.Web.Security; public class MembershipWrapper { public string CreateUser(string emailAddress_, string forename_, string surname_, Guid companyGroupId_, string contactNumber_, UserStatus userStatus_, UserType userType_, Languages language_, List<string> roles_ = null, string userName_ = null) { string username = string.Empty; string password = GenerateRandomPassword(); Guid userId, processId; MembershipCreateStatus createStatus = MembershipCreateStatus.ProviderError; if (string.IsNullOrEmpty(userName_)) { username = GenerateUsername(forename_ + surname_); } else { username = userName_; } userId = Guid.NewGuid(); //additional businesslogic & validation here MembershipUser user = Membership.Provider.CreateUser(userName_, password, emailAddress_, "", "", true, userId, out createStatus); return createStatus.ToString(); } }
ASP.NET Core 7.0 API控制器代码
[Route("api/[controller]")] [ApiController] public class UserController : ControllerBase { [HttpPost(Name = "PostUser")] public async Task<ActionResult> PostUser([FromBody] UserCreation userCreation_) { try { switch (CreateUser(userCreation_)) { case MembershipCreateStatus.Success: return Ok(); break; default: return BadRequest(); } } catch (Exception ex) { return BadRequest(ex); } } [ApiExplorerSettings(IgnoreApi = true)] public MembershipCreateStatus CreateUser(UserCreation userCreation_) { MembershipCreateStatus membershipCreateStatus = MembershipCreateStatus.ProviderError; try { MembershipWrapper wrapper = new MembershipWrapper(); var result = wrapper.CreateUser(userCreation_.EmailAddress, userCreation_.Forename, userCreation_.Surname, Guid.Empty, userCreation_.ContactNumber, SupportCentre.Wrappers.Enums.UserStatus.Deleted, Wrappers.Enums.UserType.Admin, SupportCentre.Wrappers.Enums.Languages.English); } catch(Exception ex) { } return membershipCreateStatus; } }
解决方案
核心原因
System.Web.ApplicationServices是.NET Framework的引用程序集,仅用于编译时校验,不能在运行时加载执行。ASP.NET Core的运行时环境和.NET Framework不兼容,无法直接加载这类Framework专属的运行时组件。
可行方案
直接操作原站点数据库
- 分析原
Membershipprovider对应的数据库表结构(通常是aspnet_Users、aspnet_Membership等系列表),在Core API中直接用SQL或EF Core操作这些表,模拟Membership.CreateUser的逻辑。 - 优势:完全脱离.NET Framework依赖,避免跨运行时问题,性能更直接。
- 注意:需要还原原站点的密码加密规则(默认是SHA1加盐,需匹配原配置),以及角色、用户状态等字段的处理逻辑。
- 分析原
将Wrapper改为独立的.NET Framework服务
- 把Wrapper项目改成独立的.NET Framework 4.7.2 Web API或Windows服务,Core 7.0 API通过HTTP请求调用这个服务来执行
CreateUser操作。 - 优势:保留原
Membership的所有内置逻辑,无需手动还原复杂规则;彻底避免跨运行时直接引用的问题。 - 注意:需要处理服务间的通信认证、错误传递等问题。
- 把Wrapper项目改成独立的.NET Framework 4.7.2 Web API或Windows服务,Core 7.0 API通过HTTP请求调用这个服务来执行
切换Core项目到.NET Framework(不推荐)
- 将Core 7.0项目的目标框架改为
.NET Framework 4.7.2,但这样会失去Core的跨平台优势,不符合项目需求,仅适合临时测试。
- 将Core 7.0项目的目标框架改为
推荐方案
优先选择直接操作数据库,无需额外部署服务,更符合Core项目的设计理念;如果原Membership逻辑复杂(比如自定义Provider、特殊密码规则),则选择独立Framework服务的方案。
内容的提问来源于stack exchange,提问作者Matt Holcroft
相关产品推荐
相关产品推荐

