使用自定义身份发布数据的Web API [英] Posting data to Web API using custom Authentication

查看:133
本文介绍了使用自定义身份发布数据的Web API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是在一个<一个后续href=\"http://stackoverflow.com/questions/20836409/web-api-authentication-using-message-handler-and-httpclient\">earlier问题使用的HttpClient使用Web API使用自定义的消息处理程序进行认证有关。

This is a follow-up on an earlier question regarding using HttpClient with Web API performing authentication using a custom Message Handler.

我可以从服务器使用所提供的解决方案要求的数据,但现在我有麻烦张贴JSON数据到服务器。每当我尝试发布数据到Web API,我返回内部服务器错误响应code。

I can request data from the server using the provided solution, but now I am having trouble posting JSON data to the server. Whenever I try posting data to the Web API I am returned an Internal Server Error response code.

下面是在客户端的code:

Here is the code on the client side:

using (var httpClient = new HttpClient())
{
    var request = new HttpRequestMessage();
    request.Headers.Add("X-Token", UserSession.GlobalInstance.SecurityToken);
    request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    request.Method = HttpMethod.Post;
    request.RequestUri = new Uri(_apiBaseAddress + "api/User");
    request.Content = new ObjectContent<UserDTO>(userDTO, new JsonMediaTypeFormatter());

    var response = httpClient.SendAsync(request).Result;
    if (response.IsSuccessStatusCode)
    {
        // handle result code
    }

    throw new Exception(String.Format("Server generated error response: {0}", response.StatusCode));
}

有关控制器方法的声明:

The declaration for the controller method:

public class UserController : ApiController
{
    public long Post(UserDTO userDTO)
    {
        // create user and return custom result
        // code (e.g. success, duplicate email, etc...)
    }
}

(我还添加[FromBody]该方法的参数,但具有相同的结果结束了)。

(I've also added [FromBody] to the method parameter, but end up with the same result).

在code为我的消息处理和路由配置的快照可以发现这里

A snapshot of the code for my message handler and routing configuration can be found here.

推荐答案

您code按预期工作...

Your code works as expected...

服务器端。
创建控制台应用程序并运行的NuGet

The server side. Create a console application and run NuGet

安装封装Microsoft.AspNet.WebApi.OwinSelfHost

的Program.cs

internal class Program
{
    private static IDisposable _server;

    private static void Main(string[] args)
    {
        _server = WebApp.Start<Startup>("http://localhost:12345");
        Console.ReadLine();
        _server.Dispose();
    }
}

Startup.cs

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

WebApiConfig.cs

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        var userTokenInspector = new UserTokenInspector {InnerHandler = new HttpControllerDispatcher(config)};
        config.Routes.MapHttpRoute(
            "UserAuthenticationApi",
            "api/{controller}/Authenticate",
            new {controller = "User", action = "Authenticate"},
            null
            );

        config.Routes.MapHttpRoute(
            "DefaultApi",
            "api/{controller}/{id}",
            new {id = RouteParameter.Optional},
            null,
            userTokenInspector
            );
    }
}

UserTokenInspector.cs

public class UserTokenInspector : DelegatingHandler {
    protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
    CancellationToken cancellationToken) {
        const string TOKEN_NAME = "X-Token";

        if (!request.Headers.Contains(TOKEN_NAME)) {
            return Task.FromResult(request.CreateErrorResponse(HttpStatusCode.Unauthorized,
            "Request is missing authorization token."));
        }

        try {
            //var token = UserToken.Decrypt(request.Headers.GetValues(TOKEN_NAME).First());

            // validate token
            // ...
            // ...

            Thread.CurrentPrincipal = new GenericPrincipal(new GenericIdentity("alex"), new string[] { });
        }
        catch {
            return Task.FromResult(request.CreateErrorResponse(HttpStatusCode.Unauthorized, "Invalid token."));
        }

        return base.SendAsync(request, cancellationToken);
    }
}

UserController.cs

public class UserController : ApiController
{
    public long Post(UserDTO userDTO)
    {
        // create user and return custom result
        // code (e.g. success, duplicate email, etc...)
        return 1;
    }
}

UserDto.cs

public class UserDTO
{
    public string Username { get; set; }
}

Values​​Controller.cs

public class ValuesController : ApiController
{
    public HttpResponseMessage Get()
    {
        return Request.CreateResponse(HttpStatusCode.OK, "yay");
    }
}

客户端...创建一个控制台应用程序并运行的NuGet:

The Client... create a Console application and run NuGet:

安装封装Microsoft.AspNet.WebApi.Client

的Program.cs

internal class Program
{
    private static void Main(string[] args)
    {
        var request = new HttpRequestMessage();
        request.Headers.Add("X-Token", "token");
        request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        request.Method = HttpMethod.Post;
        var baseAddress = "http://localhost:12345/";
        request.RequestUri = new Uri(baseAddress + "api/User");
        var userDto = new UserDTO() {Username = "Alex"};
        request.Content = new ObjectContent<UserDTO>(userDto, new JsonMediaTypeFormatter());
        var httpClient = new HttpClient();
        var response = httpClient.SendAsync(request).Result;
        if (response.IsSuccessStatusCode)
        {
            // handle result code
            Console.WriteLine(response.StatusCode);
            Console.ReadLine();
        }
    }
}

这篇关于使用自定义身份发布数据的Web API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆