2017-02-09 13 views
0

У меня есть проект C#, где в моем классе контроллера можно ссылаться на библиотеку System.Web.Http, но в другом классе он не может. Ссылка была добавлена ​​в общий проект, и оба класса имеют все необходимые директивы.System.Web.Http-сборка не всегда видна в том же проекте C#

Метод запроса System.Web.Http не может быть разрешен в некоторых случаях?

Вот фрагменты кода из двух классов:

Контроллеры/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 

. 
. 
. 
} 
+0

'Request' это свойство на' ApiController'. Где вы ожидаете «CSVmgr», чтобы получить его? – yaakov

+0

Он утверждает, что System.Web.Http не нужен, потому что это так. Вы не используете и не наследуете какой-либо тип, который находится в этом пространстве имен. –

+0

Что заставляет вас думать, что это ошибка? Это приводит к ошибке компилятора любого типа (помимо предупреждения о ненужной директиве 'using')? – CoolBots

ответ

0

Я думаю, вы должны согласиться с вашим компилятором/IDE (Visual Studio?) В этом случае - это просто указывает, что ссылочная сборка не используется в этом классе.

Если вы решите использовать любую функциональность с этой сборки, соответствующее предупреждение исчезнет.

EDIT на основе комментариев: Если функциональность вам нужно, это часть protected интерфейса другого класса, например ApiController, вы должны расширить этот класс для доступа к этим функциям в собственном классе. Если такое расширение впоследствии использует методы в сборке, на которую вы ссылаетесь (и для которой компилятор показывает ненужную директиву using), предупреждение компилятора относительно директивы using также решит.

+0

Не удается выполнить компиляцию, поскольку метод Request является защищенной функцией класса ApiController, из которой мой новый класс не наследуется. ApiController.Request() не может использоваться, например, как статическая функция System.IO.Path(). –

+0

@WalterZAMBOTTI - как бы ссылаться на сборку справки в этом случае ??? Защищенный метод может быть доступен только классу объявления или дочернему классу. – CoolBots

0

в вашем контроллере api, Request является типом HttpRequestMessage, а CreateResponse - это метод расширения HttpRequestMessage. почему бы не создать новый экземпляр HttpResponseMessage в вашем CSVmgr классе. например:

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

Спасибо. Это самое простое решение, которое сработало! –

0

codran 17 объяснил это лучшим.

Мой новый класс не является производным от класса APIController, а метод Request этого класса не является статической функцией, которую я могу назвать, например, как System.IO.Path(). Поэтому я должен использовать другую статическую функцию из класса, который возвращает те же результаты или передает ссылку на APIController в мой новый класс.

Как так:

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);