【问题标题】:Posting data to Web API using custom Authentication使用自定义身份验证将数据发布到 Web API
【发布时间】:2014-01-02 20:08:05
【问题描述】:

这是earlier question 的后续报道,内容涉及使用带有 Web API 的 HttpClient 使用自定义消息处理程序执行身份验证。

我可以使用提供的解决方案从服务器请求数据,但现在我无法将 JSON 数据发布到服务器。每当我尝试将数据发布到 Web API 时,都会返回一个内部服务器错误响应代码。

这是客户端的代码:

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));
}

控制器方法的声明:

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

(我还在方法参数中添加了 [FromBody],但结果相同)。

我的消息处理程序和路由配置的代码快照可以在here 找到。

【问题讨论】:

    标签: c# json asp.net-web-api


    【解决方案1】:

    您的代码按预期工作...

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

    Install-Package 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; }
    }
    

    ValuesController.cs

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

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

    Install-Package 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();
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2017-01-13
      • 2016-05-06
      • 2016-04-05
      • 2018-03-15
      • 2014-05-21
      • 2016-12-11
      • 2019-08-11
      • 2014-08-09
      • 2019-03-12
      相关资源
      最近更新 更多