You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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专属的运行时组件。

可行方案

  1. 直接操作原站点数据库

    • 分析原Membership provider对应的数据库表结构(通常是aspnet_Users、aspnet_Membership等系列表),在Core API中直接用SQL或EF Core操作这些表,模拟Membership.CreateUser的逻辑。
    • 优势:完全脱离.NET Framework依赖,避免跨运行时问题,性能更直接。
    • 注意:需要还原原站点的密码加密规则(默认是SHA1加盐,需匹配原配置),以及角色、用户状态等字段的处理逻辑。
  2. 将Wrapper改为独立的.NET Framework服务

    • 把Wrapper项目改成独立的.NET Framework 4.7.2 Web API或Windows服务,Core 7.0 API通过HTTP请求调用这个服务来执行CreateUser操作。
    • 优势:保留原Membership的所有内置逻辑,无需手动还原复杂规则;彻底避免跨运行时直接引用的问题。
    • 注意:需要处理服务间的通信认证、错误传递等问题。
  3. 切换Core项目到.NET Framework(不推荐)

    • 将Core 7.0项目的目标框架改为.NET Framework 4.7.2,但这样会失去Core的跨平台优势,不符合项目需求,仅适合临时测试。

推荐方案

优先选择直接操作数据库,无需额外部署服务,更符合Core项目的设计理念;如果原Membership逻辑复杂(比如自定义Provider、特殊密码规则),则选择独立Framework服务的方案。

内容的提问来源于stack exchange,提问作者Matt Holcroft

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 11:03:16