System.Web.Http 程序集在同一个 c# 项目中并不总是可见

System.Web.Http assembly not allways visible in same c# project

我有一个 C# 项目,在我的控制器 class 中可以引用 System.Web.Http 库,但在另一个 class 中则不能。引用已添加到整个项目中,并且两个 classes 都有所有必要的使用指令。

System.Web.Http的Request方法在某些情况下无法解析?

这是两个 classes 的代码片段:

Controllers/FormsController.cs

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;
using System.Web.Http.Description;
using FormsImport.Models;

namespace FormsImport.Controllers
{
    public class TCSTasksController : ApiController
    {

        [Route("api/TCSUploadFile")]
        [AllowAnonymous]
        public async Task<HttpResponseMessage> UploadCSVFile()
        {
            try
            {
                var httpRequest = HttpContext.Current.Request;

                foreach (string file in httpRequest.Files)
                {
                    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created);  // <-- the name Request does exists
.
.
.
}

CSVmanager.cs

using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using System.Web;
using System.Web.Http;  //<-- Compiler claims this directive is unneccesary
using System.Web.Http.Description;
using FormsImport.Models;


namespace FormsImport
{
    public class CSVmgr
    {

        public async Task<HttpResponseMessage> UploadCSVFile()
        {
            try
            {
                var httpRequest = HttpContext.Current.Request;

                foreach (string file in httpRequest.Files)
                {
                    HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Created); // <-- the name Request Does not exist in the current context

.
.
.
}

我认为您应该同意您的 compiler/IDE(Visual Studio?)在这种情况下 - 它只是指出引用的程序集未在此 class 中使用。

如果您决定使用此程序集中的任何功能,相关警告将消失。

根据评论进行编辑: 如果您需要的功能是另一个 class 的 protected 接口的一部分,例如 ApiController ,您必须扩展 class 以在您自己的 class 中访问此类功能。如果此类扩展随后使用您引用的程序集中的方法(并且编译器显示不必要的 using 指令),则有关 using 指令的编译器警告同样会解决。

在你的api控制器中,Request是一个HttpRequestMessage类型,CreateResponse是HttpRequestMessage的扩展方法。为什么不在您的 CSVmgr class 中创建一个 HttpResponseMessage 新实例。喜欢:

HttpResponseMessage response = new HttpResponseMessage();
response.StatusCode = HttpStatusCode.Created;

codran 17 解释得最好。

我的新 class 不是从 APIController Class 派生的,并且 class 的 Request 方法不是我可以调用的静态函数 System.IO.Path( ) 例如。因此,我必须使用 class 中的另一个静态函数来获得 returns 相同的结果,或者将对 APIController 的引用传递给我的新 class.

像这样:

public async Task<HttpResponseMessage> UploadCSVFile(ApiController controller)
{
    Dictionary<string, object> dict = new Dictionary<string, object>();

    try
    {
        var httpRequest = HttpContext.Current.Request;

        foreach (string file in httpRequest.Files)
        {
            HttpResponseMessage response = controller.Request.CreateResponse(HttpStatusCode.Created);