2016-03-08 75 views
0

我正在构建一个ASP.Net MVC Web应用程序,它将成为安全设备的入口。该设备支持JSON API。我尝试开发客户端(使用$httpProvider方法发布和获取数据的angularJS脚本),但却陷入了CORS的问题。如何从ASP.Net MVC控制器发布JSON数据?

我想要做的是:Web应用程序服务器将发布并获取请求,然后将它们作为简单HTML重定向到客户端。

问题是我该如何执行从我的控制器到这个设备的HTTP请求。

这个question有一个答案,不清楚。

要注意我尝试在控制器中使用HTTPWebRequest,但名称空间System.Net.HTTP.WebRequest不会被包含在内,即使它在我的项目的引用中。

编辑: 尝试至今: 这是帐户型号:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 
using System.Data.Entity; 
using System.Globalization; 
using System.Web.Security; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Threading.Tasks; 

namespace Project1.Models 
{ 
    public class LoginModel 
    { 
     [Required] 
     [Display(Name = "User name")] 
     public string UserName { get; set; } 

     [Required] 
     [DataType(DataType.Password)] 
     [Display(Name = "Password")] 
     public string Password { get; set; } 




     internal System.Web.Mvc.ActionResult PostJson(LoginModel model, StringContent query) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

这是控制器:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Transactions; 
using System.Web; 
using System.Web.Mvc; 
using Newtonsoft; 
using System.Web.Security; 
using DotNetOpenAuth.AspNet; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using Microsoft.Web.WebPages.OAuth; 
using WebMatrix.WebData; 
using Project1.Models; 

namespace Project1.Controllers 
{ 
    [Authorize] 
    public class AccountController : Controller 
    { 
     public async Task<ActionResult> PostJson(LoginModel model, StringContent data) 
     { 
      using (var client = new HttpClient()) 
      { 
       client.BaseAddress = new Uri("http://localhost:1532/Account/Login"); 
       HttpResponseMessage response = await client.PostAsync("http://192.168.30.1/jsonrpc", data); 
       if (response.IsSuccessStatusCode) 
       { 
        Console.Write(response.ToString()); 

       } 
       Console.Write(response.ToString()); 
       return View(model); 

      } 
     } 

     // 
     // GET: /Account/Login 

     [AllowAnonymous] 
     public ActionResult Login(string returnUrl) 
     { 
      ViewBag.ReturnUrl = returnUrl; 
      return View(); 
     } 

     // 
     // POST: /Account/Login 

     [HttpPost] 
     [AllowAnonymous] 
     [ValidateAntiForgeryToken] 
     public ActionResult Login(LoginModel model, string returnUrl) 
     { 
      if (ModelState.IsValid) 
      { 
       var data ="{\"params\" : [{\"url\" : \"sys/login/user\",\"data\" : [{\"passwd\" :" + model.Password +",​\"user\" :" + model.UserName + "}]}],\"session\" : 1,\"id\" : 1,\"method\" : \"exec\"}"; 
       StringContent query = new StringContent(data); 
       return (model.PostJson(model,query)); 
      } 

      // If we got this far, something failed, redisplay form 
      ModelState.AddModelError("", "The user name or password provided is incorrect."); 
      return View(model); 
     } 


     #region Helpers 
     private ActionResult RedirectToLocal(string returnUrl) 
     { 
      if (Url.IsLocalUrl(returnUrl)) 
      { 
       return Redirect(returnUrl); 
      } 
      else 
      { 
       return RedirectToAction("Index", "Home"); 
      } 
     } 
     #endregion 
    } 
} 
+1

你应该看看[httpclient](https://msdn.microsoft.com/en-us/library/system.net.http.httpclient(v = vs.118).aspx) –

+0

@CallumLinington这看起来像它会工作。问题是使用POST和GET与HttpClient导致一些问题,因为post和get是异步的并且控制器是同步的。 –

+0

控制器的动作可以是异步 –

回答

1

PostMan发送JSON我能后为JSON请求以及响应创建类。接下来我要做的就是添加一个我称为Service的课程。在这个类中,它有一个整数和JSON服务器的url作为属性,我添加了所有的函数来调用API。整数表示请求的ID,并且URL将在每个函数中使用。

现在,这是真正重要的。 下面的代码是用于使用从远程设备凭据登录和JSON数据发送用户输入:

public Response Login(String usr, String pwd) 
     { 
      this.MyId++; 
      Request model = new Request(id, usr, pwd); 
      var http = (HttpWebRequest)WebRequest.Create(uri); 
      http.Accept = "application/json"; 
      http.ContentType = "application/json"; 
      http.Method = "POST"; 
      String json = Newtonsoft.Json.JsonConvert.SerializeObject(model); 
      UTF8Encoding encoding = new UTF8Encoding(); 
      Byte[] bytes = encoding.GetBytes(json); 

      Stream newStream = http.GetRequestStream(); 
      newStream.Write(bytes, 0, bytes.Length); 
      newStream.Close(); 

      var response = http.GetResponse(); 

      var stream = response.GetResponseStream(); 
      var sr = new StreamReader(stream); 
      var content = sr.ReadToEnd(); 
      Response res= Newtonsoft.Json.JsonConvert.DeserializeObject<Response>(content.ToString()); 
      return res; 

     } 

正如你看到这里,我们创建了一个c#类调​​用请求的一个实例。这个类然后被序列化成JSON字符串。然后将JSON字符串放入流中并与UTF-8 Encoding一起发送。然后我们得到响应并将其反序列化为一个c#类,通过它我们可以知道用户是否已通过身份验证。根据结果​​,我们可以将客户端重定向到他的主页或提示他输入正确的登录名和密码。

PS这个程序完全免费的CORS。这样我就可以在我的服务器中发送和接收数据并进行评估,然后相应地发送HTML视图。这使我的请求和远程设备完全隐藏。

相关问题