【发布时间】: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