Guten Morgen zusammen,
ich versuche mich gerade in ASP.NET Web Apis einzuarbeiten und habe ein Problem bei dem ich ganz schön auf dem Schlauch stehe.
Ich habe ein ASP.NET MVC 4 - Web API Projekt erstellt und will darin einfach ein paar Personen anzeigen. Ich habe dazu
Im Hintergrund habe ich ein einfaches Repository erstellt welches mir beispielsweise alle Personen in der Datenbank anzeigen soll:
Auszug aus GenericRepository
public class GenericRepository<C, T> : IGenericRepository<T>
where T: class where C: WoContext, new()
{
private C _context = new C();
public C Context
{
get { return _context; }
set { _context = value; }
}
public IQueryable<T> Get()
{
var query = _context.Set<T>();
return query;
}
Mein HomeController:
public class HomeController : Controller
{
private readonly WoPersonRepository _repository = new WoPersonRepository();
public ActionResult Index()
{
return View(_repository.Get());
}
}
Mein Api Controller:
public class AthleteController : ApiController
{
private readonly WoPersonRepository _repository = new WoPersonRepository();
public IEnumerable<WoPerson> GetAllAthletes()
{
return _repository.Get();
}
public WoPerson GetAthlete(Guid id)
{
return _repository.Get(p => p.Id == id).FirstOrDefault();
}
Jetzt habe ich folgendes Problem. Wenn ich die Seite starte über VS2011 dann bekomme ich ja den HomeController angezeigt. Hier werden alle in der Datenbank befindlichen Daten auch aufgelistet.
Mache ich jetzt ein http://localhost:2345/api/athlete
bekomme ich einen Serverfehler. Beim Debuggen bringt er mir einen Count von 0.
Die Frage ist jetzt was ich falsch mache? Muss ich bei einem ApiController etwas besonderes beachten?
Meine web.config
<?xml version="1.0" encoding="utf-8"?>
<!--
For more information on how to configure your ASP.NET application, please visit
http://go.microsoft.com/fwlink/?LinkId=169433
-->
<configuration>
<configSections>
<!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
<section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
</configSections>
<connectionStrings>
<add name="WoContext"
providerName="System.Data.SqlClient"
connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;initial catalog=TestDb"/>
</connectionStrings>
<appSettings>
Meine Route.config
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
}
Vielleicht hat jemand einen Tipp für mich?
Vielen Dank,
Benedikt
... und wie lautet der Serverfehler? Da stehts detailliert drin, was falsch ist.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
... und wie lautet der Serverfehler? Da stehts detailliert drin, was falsch ist.
Du meinst eine Beachtung der [Hinweis] Wie poste ich richtig? Punkt 5? Ach komm, das wäre doch jetzt wirklich zu einfach...
Mh? Willst jetzt verraten, was der Server für nen Fehler wirft oder nicht? Sonst können wirs lassen. 🤔
Dass der Aufruf durch http://localhost:2345/api/athlete prinzipiell nen Fehler wirft sollte doch an für sich klar sein. Du rufst zwar den Controller "athlete" auf - aber gar keine Methode....? Auch in der Route ist kein Standard definiert, sondern nur ne ID.
Und nein, man muss beim ApiController nichts besonderes beachten. Das ist ja das tolle an dem Ding.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Mh? Willst jetzt verraten, was der Server für nen Fehler wirft oder nicht? Sonst können wirs lassen. 👶
Mh?! Es soll doch tatsächlich Leute geben die auch noch etwas arbeiten müssen, eine Familie haben oder einfach mal keine Lust auf Internet.
Dass der Aufruf durch
> prinzipiell nen Fehler wirft sollte doch an für sich klar sein. Du rufst zwar den Controller "athlete" auf - aber gar keine Methode....? Auch in der Route ist kein Standard definiert, sondern nur ne ID.
Wie soll ich es formulieren? Das ist Quatsch was du schreibst. Das würde ja einem RESTful Ansatz widersprechen. Egal, ich will hier nicht auch noch mit Halbwissen um mich schmeißen.
Grundsätzlich funktioniert das ganze schon. Wenn ich einfach ein String-Array zurückliefere in meiner Get() Methode bekomme ich auch die XML bzw. den JSON Satz angezeigt. Spricht also auch gegen Deine Theorie.
Und nein, man muss beim ApiController nichts besonderes beachten. Das ist ja das tolle an dem Ding.
Danke. Das war doch schon einmal hilfreich.
ZUM FEHLER:
Ich habe momentan einfach nur eine Page die mir den Serverfehler 500 Internal Server Error meldet. Leider bekomme ich den IIS momentan nicht so konfiguriert, dass er mir weiter, hilfreichere Nachrichten ausspuckt.
Vielleicht hat hier jemand einen Tipp?
Wenn jemand bereit ist mir auf vernünftige Art und Weise zu helfen nehme ich die Tipps und Ratschläge gerne an.
Aber ich muss mich hier nicht anmachen lassen nur weil jemand denkt mit 2000 Posts hätte er Ahnung und ein Anrecht auf eine 1 Stunden Antwortzeit. Dafür ist mir die Zeit zu Schade.
Ich bin gerne bereit auf einer normalen Basis zu diskutieren. Ich habe die Weisheit auch nicht mit Löffeln gefressen und wie gesagt, bin ich auf dem Gebiet kein Experte.
Vielen Dank,
Benedikt
Hallo,
möglicherweise kommt der Fehler daher, dass bei einem Aufruf von http://localhost:2345/api/athlete die Guid null wäre.
Also entweder Guid? oder mal testweise den Parameter ganz rauswerfen.
Ansonsten schau mal hier:
Introduction to the ASP.NET Web API
Vielen Dank. Der Link ist super, Danke. Hm, ja die Guid ist hier vielleicht wirklich nicht glücklich gewählt. Ich werde das mal austesten.
VG, Benedikt
Hallo,
Ich habe momentan einfach nur eine Page die mir den Serverfehler 500 Internal Server Error meldet.
Dann findest Du vielleicht was darüber im EventLog des Servers.
Aber ich muss mich hier nicht anmachen lassen
War vermutlich nur ein Missverständnis, bei dem Abt davon ausging, vagtlers Antwort sei von Dir gekommen 😦
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Oh - davon bin ich sogar wirklich ausgegangen 8o. Trotzdem kann man ein wenig mehr Freundlichkeit entgegen bringen, wenn einem geholfen werden soll - und nicht solche haltlosen Vorwürfe in den Raum werfen.
Nichts desto trotz stimmt der Aufruf des Controllers nicht.
Auch eine GUID ist hier "sinnlos", da eben der Controller aber nicht die Methode augerufen wird.
Siehe auch den Punkt Getting a Set of Records with the ASP.NET Web API
unter http://stephenwalther.com/archive/2012/03/05/introduction-to-the-asp-net-web-api.aspx
Schau Dir jabbr.net an. Das ist 'das' Vorzeigeprojekt von ASP.NET MVC + WebApi + SignalR.
Dass der Server nur ein 500 zurück gibt ist hier nicht korrekt.
Er muss auch den Fehler zurück geben, sofern er auf GET-Anfragen konfiguriert ist und darauf zugegriffen wird. Zudem können die Fehlermeldungen alle in Application_Error
in der Global.asax.cs abgefangen werden.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Das war nicht meine Absicht. Aus der Emotion heraus. Dafür Entschuldige ich mich.
Schau Dir jabbr.net an. Das ist 'das' Vorzeigeprojekt von ASP.NET MVC + WebApi + SignalR.
Danke. Werde ich mir anschauen.
Dass der Server nur ein 500 zurück gibt ist hier nicht korrekt.
Er muss auch den Fehler zurück geben, sofern er auf GET-Anfragen konfiguriert ist und darauf zugegriffen wird. Zudem können die Fehlermeldungen alle inApplication_Error
in der Global.asax.cs abgefangen werden.
Auch das werde ich weiterhin verfolgen.
Danke für die Hinweise. Ich werde dem ganzen weiter versuchen auf den Grund zu gehen.
VG, Benedikt