如何正确调用 ASP .NET MVC WebAPI 2 方法

Posted

技术标签:

【中文标题】如何正确调用 ASP .NET MVC WebAPI 2 方法【英文标题】:How to call ASP .NET MVC WebAPI 2 method properly 【发布时间】:2014-01-03 12:14:01 【问题描述】:

我已经为 ASP .NET MVC WebAPI 2 创建了单独的项目,我想调用 Register 方法。 (我用的是VS2013默认创建的项目。)

[Authorize]
[RoutePrefix("api/Account")]
public class AccountController : ApiController

    .... 

    // POST api/Account/Register
    [AllowAnonymous]
    [Route("Register")]
    public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    
        if (!ModelState.IsValid)
        
            return BadRequest(ModelState);
        

        IdentityUser user = new IdentityUser
        
            UserName = model.UserName
        ;

        IdentityResult result = await UserManager.CreateAsync(user, model.Password);
        IHttpActionResult errorResult = GetErrorResult(result);

        if (errorResult != null)
        
            return errorResult;
        

        return Ok();
    

我使用简单的 WPF 应用程序来做到这一点。我不确定调用此方法并将用户名和密码传递给它的语法由于RegisterBindingModel

  public partial class MainWindow : Window
    
        HttpClient client;

        public MainWindow()
        
            InitializeComponent();        
        

        private  void Button_Click(object sender, RoutedEventArgs e)
        
            Test();
        

        private async void Test()
        
            try
            
                var handler = new HttpClientHandler();
                handler.UseDefaultCredentials = true;
                handler.PreAuthenticate = true;
                handler.ClientCertificateOptions = ClientCertificateOption.Automatic;

                handler.Credentials = new NetworkCredential("test01","test01"); 

                client = new HttpClient(handler);
                client.BaseAddress = new Uri("http://localhost:22678/");
                client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json")); // It  tells the server to send data in JSON format.

                var response = await client.GetAsync("api/Register");
                response.EnsureSuccessStatusCode(); // Throw on error code.

                // How to pass RegisterBindingModel ???     
                var data = await response.Content.ReadAsAsync<?????>();

            
            catch (Newtonsoft.Json.JsonException jEx)
            
                MessageBox.Show(jEx.Message);
            
            catch (HttpRequestException ex)
            
                MessageBox.Show(ex.Message);
            
            finally
            
            
         

有什么线索吗?

【问题讨论】:

【参考方案1】:

这取决于你的 Web API 服务的路由,但似乎你忘记了路由中的控制器名称。

默认应该是

api/Account/Register

或者你的代码

client.BaseAddress = new Uri("http://localhost:22678/");
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
var response = await client.PostAsync("api/Account/Register", ...body content...);

顺便说一下,HTTP 动词应该是 POST 而不是 GET,你应该在正文中放一些东西。

您可以使用PostAsync method argument called Content 传递正文。在您的情况下,最好的选择是使用ObjectContent

关于如何使用对象的示例你可以在这里找到Calling a Web API From a .NET Client,引用自这篇文章:

PostAsJsonAsync 是定义在 System.Net.Http.HttpClientExtensions。它相当于 以下:

var product = new Product()  Name = "Gizmo", Price = 100, Category = "Widget" ;

// Create the JSON formatter.
MediaTypeFormatter jsonFormatter = new JsonMediaTypeFormatter();

// Use the JSON formatter to create the content of the request body.
HttpContent content = new ObjectContent<Product>(product, jsonFormatter);

// Send the request.
var resp = client.PostAsync("api/products", content).Result;

【讨论】:

是的,是的...但是我如何发送`RegisterBindingModel`?它有用户名和密码字段...如何放入正文?【参考方案2】:

基本上你需要将模型序列化到post body中,以使mvc框架可以反序列化并再次形成模型。这些帖子应该可以帮助您了解序列化数据的格式:

http://www.asp.net/web-api/overview/formats-and-model-binding

http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

【讨论】:

以上是关于如何正确调用 ASP .NET MVC WebAPI 2 方法的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS + ASP.NET Web API + ASP.NET MVC 身份验证

在 asp.net mvc 之上使用 angular js 的好处

如何正确处理 ASP.NET MVC 中的 404?

Asp.Net MVC:如何让 Html.ActionLink 正确呈现整数值?

使用 JQuery Ajax 和 ASP.Net Mvc 的正确模式是啥?

asp.net(mvc) 如何知道mvc版本