Laden...

[gelöst] ASP.NET Core kann Controller nicht aufrufen?

Erstellt von Olii vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.321 Views
O
Olii Themenstarter:in
76 Beiträge seit 2017
vor 4 Jahren
[gelöst] ASP.NET Core kann Controller nicht aufrufen?

Hallo, ich bastel gerade eine kleine API mit GraphQL. Ich habe das Problem das wenn ich ein Request schicke ich zwar, wenn ich ein Haltepunkt mache im Konstruktor des Controllers, dort rein komme, aber die Funktion also der eigentliche Endpoint nicht aufgerufen wird. Ich finde einfach nicht raus woran es liegt. Bei dem Standard Endpoint wenn man eine neue API erstellt, klappt es.

Der Controller


[Route("graphql")]
    public class GraphQLController : Controller
    {
        public GraphQLController(IDocumentExecuter documentExecuter,ISchema schema)
        {
            _documentExecuter = documentExecuter;
            _schema = schema;
        }

        [HttpPost]
        public async Task<IActionResult> Post([FromBody]GraphQLQuery query)
        {
         //.........
         }
    }

Die Anfrage schicke ich dann über Postmen an den Point:
http://localhost:5000/graphql

Mit dem Body:


{ 
 "query":
  "query{
     category(id:1){
       id 
       name
     }
   }"
}

*EDIT
Hier auch noch die Startup-Datei:


public void ConfigureServices(IServiceCollection services)
        {
            services.AddScoped<EasyStoreQuery>();   
            services.AddTransient<ICategoryRepository, CategoryRepository>();
            services.AddTransient<IProductRepository, ProductRepository>();   
            services.AddScoped<IDocumentExecuter, DocumentExecuter>();
            services.AddTransient<CategoryType>();
            services.AddTransient<ProductType>();
            var sp = services.BuildServiceProvider();
            services.AddScoped<ISchema>(_ => new EasyStoreSchema(type => (GraphType) sp.GetService(type)) {Query = sp.GetService<EasyStoreQuery>()});

            services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
        }

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseHsts();
            }

            //app.UseCors("EnableCORS");
            app.UseHttpsRedirection();
            app.UseMvc();
        }

*EDIT *EDIT
Ich habe heruasgefunden das es


[FromBody]GraphQLQuery query

In der Funktion liegt. Aber soweit ich das sehe müsste das richtig sein.
Das Model:


public class GraphQLQuery
    {
        public string OperationName { get; set; }
        public string NamedQuery { get; set; }
        public string Query { get; set; }
        public string Variables { get; set; }
    }

Nehme ich das [FROMBODY] weg dann wird die Funktion aufgerufen, aber die variable ist dann leer ...

Ich versteh einfach nicht wieso die Funktion nicht aufgerufen wird. In meiner Rest API funktioniert das einwandfrei..

Ich danke im voraus schon einmal für Hilfe 😃
Gruß Olli

6.910 Beiträge seit 2009
vor 4 Jahren

Hallo Olii,

schön dass du eine Lösung gefunden hast, und dein Thema dementsprechend.auch als [gelöst] markiert hast. Noch besser wäre es, wenn du eine Antwort erstellt hättest, damit der Thread nicht mehr in den "Fragen ohne Antwort" auftaucht. Durch diese Antwort ist das Ziel aber auch erreicht.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

16.792 Beiträge seit 2008
vor 4 Jahren
services.AddScoped<ISchema>(_ => new EasyStoreSchema(type => (GraphType) sp.GetService(type)) {Query = sp.GetService<EasyStoreQuery>()});

vermeide sowas, wenn möglich.

Das geht saubrer:

            services.AddScoped<IObjectGraphType, MyGraphQuerySchema>();
            services.AddScoped<ISchema, MyQuerySchema>();

Link

O
Olii Themenstarter:in
76 Beiträge seit 2017
vor 4 Jahren

Ich bin ehrlich, ich weis gar nicht so genau was die Zeile Code mascht 😄. Die ist kopiert aus einem Tutorial. Ich sehe nur Arrow-Function in Arrow-Function...

Das was du als alternative dazu geschrieben hast, dass kann ich verstehen, das quasi die Klasse mit dem Interface verbunden wird, sag ich jetzt mal.

Vielen Dank für den Hinweis! 😃

16.792 Beiträge seit 2008
vor 4 Jahren

Dependency Injection Sample von mir ist quasi ein implizites Erstellen von Instanzen durch Registrierung.
Dein Code macht das ganze explizit durch das Mischen via Service Locator Pattern - und der gilt als vermeidbarer Anti-Pattern.

O
Olii Themenstarter:in
76 Beiträge seit 2017
vor 4 Jahren

Also wenn ich das so mache:


services.AddScoped<IObjectGraphType, EasyStoreQuery>();
services.AddScoped<ISchema, EasyStoreSchema>();

Kommt eine Fehlermeldung als Output:


{
    "errors": [
        {
            "message": "Failed to call Activator.CreateInstance. Type: einfachAPI.Models.CategoryType",
            "extensions": {
                "code": "MISSING_METHOD"
            }
        }
    ]
}

Ich bin noch auf der suche was das sein könnte. Mit der Art wie es vorher war funktioniert es. Ich blick da noch nicht ganz durch.

16.792 Beiträge seit 2008
vor 4 Jahren

Dann stimmt der Aufbau der Klassen nicht.

Hab nen Vortrag zu modernen API Development; GraphQL ist auch dabei - inkl. DI Setup
https://github.com/BenjaminAbt/2018-Talks-ModernApiDevelopment