2017-02-09 2 views
0

Ich habe ein C# -Projekt, wo in meiner Controller-Klasse die System.Web.Http-Bibliothek verwiesen werden kann, aber in der anderen Klasse kann es nicht. Die Referenz wurde dem Gesamtprojekt hinzugefügt, und beide Klassen verfügen über alle erforderlichen Verwendungsrichtlinien.System.Web.Http Assembly nicht immer sichtbar in derselben C# -Projekt

Die Request-Methode von System.Web.Http kann in einigen Fällen nicht aufgelöst werden?

Hier sind Code-Snippets der beiden Klassen:

Controller/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' ist eine Eigenschaft auf' ApiController'. Woher erwartest du 'CSVmgr'? – yaakov

+0

Es behauptet, dass System.Web.Http nicht notwendig ist, weil es ist. Sie verwenden oder erben keinen Typ, der aus diesem Namespace stammt. –

+0

Was lässt Sie glauben, dass dies ein Fehler ist? Führt dies zu einem Compilerfehler jeglicher Art (neben der Warnung vor der unnötigen 'using'-Anweisung)? – CoolBots

Antwort

0

Ich glaube, Sie mit Ihrem Compiler/IDE zustimmen sollte (Visual Studio?) In diesem Fall - es wird lediglich darauf hingewiesen, dass die referenzierte Assembly in dieser Klasse nicht verwendet wird.

Wenn Sie sich entschließen, eine Funktion dieser Baugruppe zu verwenden, wird die betreffende Warnung gelöscht.

EDIT basierend auf Kommentar: Wenn die Funktionalität, die Sie benötigen Teil einer protected Schnittstelle einer anderen Klasse, wie ApiController ist, müssen Sie diese Klasse erweitern diese Funktionalität in Ihrer eigenen Klasse zugreifen. Wenn eine solche Erweiterung anschließend Methoden in der Assembly verwendet, auf die Sie verwiesen haben (und für die der Compiler eine unnötige using-Anweisung anzeigt), wird die Compilerwarnung bezüglich der using-Anweisung ebenfalls aufgelöst.

+0

Es kann nicht kompiliert werden, da die Request-Methode eine geschützte Funktion der ApiController-Klasse ist, von der meine neue Klasse nicht erbt. ApiController.Request() kann nicht wie die statische Funktion System.IO.Path() verwendet werden. –

+0

@WalterZAMBOTTI - wie würde die Referenzierung in diesem Fall helfen ??? Auf die geschützte Methode kann nur von der deklarierenden Klasse oder einer untergeordneten Klasse zugegriffen werden. – CoolBots

0

In Ihrem API-Controller ist Request ein HttpRequestMessage-Typ und die CreateResponse ist die Erweiterungsmethode von HttpRequestMessage. Warum erstellen Sie keine neue HttpResponseMessage-Instanz in Ihrer CSVmgr-Klasse? wie:

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

Danke. Das ist die einfachste Lösung, die funktioniert hat! –

0

codran 17 erklärte es am besten.

Meine neue Klasse ist nicht von der APIController-Klasse abgeleitet und die Request-Methode dieser Klasse ist keine statische Funktion, die ich zum Beispiel wie System.IO.Path() aufrufen kann. Also muss ich eine andere statische Funktion aus einer Klasse verwenden, die die gleichen Ergebnisse liefert oder einen Verweis auf den APIController an meine neue Klasse weitergibt.

Wie so:

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