2017-02-09 68 views
0

컨트롤러 클래스에서 System.Web.Http 라이브러리를 참조 할 수 있지만 다른 클래스에서는 참조 할 수없는 C# 프로젝트가 있습니다. 참조가 전체 프로젝트에 추가되었으며 두 클래스 모두 필요한 사용 지시문을 모두 갖습니다.System.Web.Http 어셈블리가 항상 동일한 C# 프로젝트에 표시되지 않습니다.

일부 인스턴스에서는 System.Web.Http의 Request 메서드를 확인할 수 없습니까? 여기

는 두 클래스의 코드 조각입니다 :

컨트롤러/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

난 당신이 (컴파일러/IDE에 동의해야한다고 생각
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

Visual Studio?)이 경우에는 참조 된 어셈블리가이 클래스에서 사용 중이 아님을 지적하는 것입니다.

이 어셈블리의 기능을 사용하기로 결정하면 문제의 경고 메시지가 사라집니다. 의견에 따라

편집 : 당신이 필요로하는 기능을 다른 클래스의 protected 인터페이스의 일부인 경우는 같은 ApiController, 당신은 당신의 자신의 수업 시간에 이러한 기능에 액세스 할 수 클래스를 확장해야합니다. 이러한 확장이 나중에 참조한 어셈블리의 메서드를 사용하고 컴파일러에서 불필요한 using 지시문을 표시하는 경우 using 지시문과 관련된 컴파일러 경고도 마찬가지로 해결됩니다.

+0

Request 메서드가 내 새 클래스가 상속하지 않는 ApiController 클래스의 보호 된 Function이기 때문에 컴파일에 실패합니다. ApiController.Request()는 예를 들어 정적 함수 System.IO.Path()처럼 사용할 수 없습니다. –

+0

@WalterZAMBOTTI -이 경우 어셈블리 도움말을 참조하면 어떻게됩니까 ??? 보호 된 메서드는 선언 클래스 또는 자식 클래스에서만 액세스 할 수 있습니다. – CoolBots

0

, 요청은 HttpRequestMessage 형식이며 CreateResponse는 HttpRequestMessage의 확장 메서드입니다. 왜 CSVmgr 클래스에서 HttpResponseMessage 새 인스턴스를 만들지 마십시오. like :

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