【问题标题】:2sxc - HttpResponseMessage reference missing in Custom api controller2sxc - 自定义 api 控制器中缺少 HttpResponseMessage 引用
【发布时间】:2017-11-27 09:59:36
【问题描述】:

当我从SxcApiController 返回基础或自定义对象时,一切正常, 但如果我尝试返回:

HttpResponseMessage”,类似:

return Request.CreateResponse(HttpStatusCode.BadRequest, new {  Message = "ERROR : " + ex.Message } );

我得到错误:

'System.Net.Http.HttpResponseMessage' 是在一个程序集中定义的 没有被引用。您必须添加对程序集的引用 'System.Net.Http,版本=4.0.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a'.",

我该如何解决这个问题?如何添加对 api 控制器的附加引用?

我已经在 api 控制器中添加了:“using System.Net.Http;”,但这不是问题...

== 已添加 ==============================

我在 2sxc.csproj 文件中找到了这段代码:

<Reference Include="System.Net.Http, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL" />
<Reference Include="System.Net.Http.Formatting, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />

还有版本=2.0.0.0

这会是个问题吗?

== 完整控制器 ===================================

using System;
using System.Net.Http;
using System.Web.Http;
using DotNetNuke.Data;
using DotNetNuke.Web.Api;
using DotNetNuke.Security;
using ToSic.SexyContent.WebApi;

public class InstallController : SxcApiController
{
    [HttpGet]
    [AllowAnonymous]
    //[DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.Host)]
    //[ValidateAntiForgeryToken]
    public object DbTablesCreate()
    {
        var result = new {  P1 = "test1", P2 = "test2" } ;
        try
        {
            // Some code I want to protect...
        }
        catch (Exception ex)
        {
            return Request.CreateResponse(HttpStatusCode.BadRequest, result);
            //return new {  Message = "Returned error with status code OK" };
        }

        return Request.CreateResponse(HttpStatusCode.OK, result);
        //return new {  Message = "Returned ok with status code OK" };
    }
}

完整结果:500 内部服务器错误

{ "Message": "2sxc Api Controller Finder: 选择 / 时出错 为请求编译控制器。请检查事件日志和 编码。有关详细信息,请参阅内部异常。", “异常消息”: "c:\websites\dev.lea-d.si\Portals\0\2sxc\nnApp\api\InstallController.cs(23): 错误 CS0012:已定义类型“System.Net.Http.HttpRequestMessage” 在未引用的程序集中。您必须添加对 程序集'System.Net.Http,版本=4.0.0.0,文化=中性, PublicKeyToken=b03f5f7f11d50a3a'.", "ExceptionType": “System.Web.HttpCompileException”,“StackTrace”:“在 System.Web.Compilation.AssemblyBuilder.Compile() 在 System.Web.Compilation.BuildProvidersCompiler.PerformBuild() 在 System.Web.Compilation.BuildManager.CompileWebFile(虚拟路径 虚拟路径)在 System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(虚拟路径 virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile,布尔 throwIfNotFound,布尔 确保IsUpToDate)在 System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext 上下文,VirtualPath virtualPath,布尔 noBuild,布尔 allowCrossApp,布尔值 allowBuildInPrecompile,布尔值 throwIfNotFound, Boolean ensureIsUpToDate) 在 System.Web.Compilation.BuildManager.GetVPathBuildResult(HttpContext 上下文,VirtualPath virtualPath,布尔 noBuild,布尔 allowCrossApp,布尔值 allowBuildInPrecompile,布尔值 确保IsUpToDate)在 System.Web.Compilation.BuildManager.GetCompiledAssembly(字符串 虚拟路径)在 ToSic.SexyContent.WebApi.AppApiControllerSelector.SelectController(HttpRequestMessage 请求)在 C:\Projects\2SexyContent\Web\DesktopModules\ToSIC_SexyContent\Sxc WebApi\AppApiControllerSelector.cs:第 77 行"}

==============解决方案1 ​​=================

我复制了

System.Net.Http.dll

到站点的Bin文件夹,然后还添加:

using System.Net;
using System.Net.Http;

现在开始工作

【问题讨论】:

  • 当前状态的问题不清楚,因为它不完整。阅读How to Ask,然后提供minimal reproducible example,可用于更好地理解和重现您的问题。
  • 如果我尝试在 SxcApiController 中使用 Request.CreateResponse ,我会收到有问题的错误描述。如果我返回 string、bool 或一些 anonimuos,那么一切正常,但也总是状态 200 作为响应,我喜欢使用 CreateResponse 返回 NotFound 或其他状态
  • 显示更多控制器动作。
  • @Nkosi 我添加了完整的控制器代码和完整的错误响应
  • 刚刚意识到你通过添加 dll 让它工作了。

标签: c# asp.net-web-api dotnetnuke 2sxc


【解决方案1】:

我复制文件:

System.Net.Http.dll

到站点的Bin文件夹,然后还添加:

using System.Net;
using System.Net.Http;

现在一切正常

【讨论】:

    【解决方案2】:

    如错误消息所述,您需要将请求的dll 添加到站点。该框架会在站点的bin 目录中搜索必要的引用,以便正确运行。

    还假设控制器是从ApiController 派生的,您可以使用不同的语法尝试以下操作

    [HttpGet]
    [AllowAnonymous]
    //[DnnModuleAuthorize(AccessLevel = SecurityAccessLevel.Host)]
    //[ValidateAntiForgeryToken]
    public IHttpActionResult DbTablesCreate() {
        var result = new {  P1 = "test1", P2 = "test2" } ;
        try {
            //...code removed for brevity
        } catch (Exception ex) {
            return Content(HttpStatusCode.BadRequest, result);
        }
        return OK(result);
    }
    

    【讨论】:

      猜你喜欢
      • 2013-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-03
      相关资源
      最近更新 更多