Lucian Maran

home

Configurare WebApi cu OWIN

02 Feb 2014

Voi pleca de la un proiect complet gol. Voi adauga apoi bibliotecile si setarile minim necesare a.i proiectul de tip WebApi obtinut sa functioneze ca o suma de module interconectate dupa specificatiile OWIN.

Codul de mai jos e disponibil si pe github.

"Hello world" - doar cu OWIN

  1. adauga un proiect gol

  1. Instaleaza unul din cele 3 host-uri care va gazdui aplicatia:

Actualizeaza pachetele instalate. Cel putin pt. varianta actuala de "Helio" acest pas este obligatoriu:

Recomand varianta Helios. Detalii aici.

Dll-urile referentiate pana acum (legate de OWIN cu System.Web) ar fi urmatoarele:

  1. Creaza in radacina proiectului un fisier numit Startup.cs cu urmatorul continut:

    using Owin;
    
    namespace Web
    {
        public class Startup
        {
            public void Configuration(IAppBuilder app)
            {
                app.Run(context =>
                {
                    context.Response.ContentType = "text/plain";
                    return context.Response.WriteAsync("Hello World!");
                });
            }
        }
    }
    

...sau, acelasi lucru in varianta "async"

```csharp
...
app.Run(async context =>
{
    context.Response.ContentType = "text/plain";
    await context.Response.WriteAsync("Hello World!");
});
...
```
  1. test OWIN (fara WebApi):

"Hello world" - OWIN si WebApi

  1. Acum, ca host-ul de tip OWIN am vazut ca functioneaza, urmeaza sa "prelungesc" pipeline-ul a.i. cererea sa fie servita de un controller WebApi.

Install-Package Microsoft.AspNet.WebApi.Owin -pre.

  1. Modific fisierul Startup.cs astfel:

    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            var config = new HttpConfiguration();
            WebApiConfig.Register(config);
    
            app.UseWebApi(config);
        }
    }
    

    unde WebApiConfig este un fisier in care am izolat setarile WebApi, astfel:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
               name: "Home",
               //routeTemplate: "{*anything}",
               routeTemplate: "{controller}",
               defaults: new { controller = "Home" });
        }
    }
    
  2. Apoi, am creat folder-ul Controllers in care am adaugat un controller simplu, ca mai jos:

    public class HomeController : ApiController
    {
        public string Get()
        {
            return "hello world";
        }
    }
    
  3. In acest moment structura proiectului este urmatoarea:

  1. iar la rularea aplicatiei ar trebui sa primim mesajul "hello world", returnat de controller:

Pregatirea WebApi pentru SPA

Adica la start (in HomeController) voi returna un fisier static (index.html) iar restul controller-elor le voi pregati sa raspunda la cereri API de tip REST.

  1. adauga in WebApiConfig o ruta pt. apelurile de tip API:

    public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            // Web API routes
            config.MapHttpAttributeRoutes();
    
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
    
            config.Routes.MapHttpRoute(
               name: "Home",
               //routeTemplate: "{*anything}",
               routeTemplate: "{controller}",
               defaults: new { controller = "Home" });
        }
    }
    
  2. adauga un controller nou, de test:

    public class ValuesController : ApiController
    {
        public IEnumerable<string> Get()
        {
            return new string[] { "value1", "value2" };
        }
    }
    
  3. test:

  1. adaug in radacina proiectului un fisier simplu, de tip html:

    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>
    </head>
    <body>
            Hello world (inside index.html file)
    </body>
    </html>
    
  2. iar in HomeController modific metoda Get() astfel:

    public HttpResponseMessage Get(){
        var filePath = HostingEnvironment.MapPath("~/index.html");
    
        var response = new HttpResponseMessage(HttpStatusCode.OK);
        response.Content = new StringContent(File.ReadAllText(filePath));
        response.Content.Headers.ContentType = new MediaTypeHeaderValue("text/html");
        return response;
    }
    
  3. test (se observa ca numele index.html nu apare in URL):

comments powered by Disqus