我正在构建一个ASP.Net MVC Web应用程序,它将成为安全设备的门户。该设备支持JSON API。我尝试开发客户端(使用$httpProvider
方法的angularJS脚本来发布和获取数据)但是陷入了CORS的问题。
我想要做的是:网络应用服务器将发布并获取请求,然后将它们作为简单的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
}
}
答案 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;
}
正如您在此处注意到的,我们创建了一个名为Request的c#
类的实例。然后将该类序列化为JSON字符串。然后将JSON字符串放入流中并与UTF-8 Encoding
一起发送。然后我们得到响应并将其反序列化为c#
类,通过它我们可以知道用户是否经过身份验证。根据结果,我们可以将客户端重定向到他的主页或提示他输入正确的登录名和密码。
PS 此程序完全CORS
免费。这样我就可以在我的服务器中发送和接收数据并对其进行评估,然后相应地发送HTML
个视图。这使我的请求和远程设备完全隐藏。