Asp.net web api 在同一http服务器上托管Aurelia CLI应用程序和WebApi服务
如何进行配置,以便在同一http服务器中启动并托管Aurelia应用程序和Web API服务 联系人管理器很棒,我完全理解为什么它会模仿web服务,但你不能构建这样的真正应用程序 是否有设置web服务的演练?事件如果它只是从文件中读取一些JSON并传递它,那么真正的问题是如何设置在同一http服务器中运行的web服务来处理XSS问题Asp.net web api 在同一http服务器上托管Aurelia CLI应用程序和WebApi服务,asp.net-web-api,cors,aurelia,Asp.net Web Api,Cors,Aurelia,如何进行配置,以便在同一http服务器中启动并托管Aurelia应用程序和Web API服务 联系人管理器很棒,我完全理解为什么它会模仿web服务,但你不能构建这样的真正应用程序 是否有设置web服务的演练?事件如果它只是从文件中读取一些JSON并传递它,那么真正的问题是如何设置在同一http服务器中运行的web服务来处理XSS问题 如果完整演练失败,请提供一些关于创建http服务器实例的节点代码位置的指导au和CLI非常棒,但它们隐藏了许多重要信息。简单的回答是,您不需要这样做 虽然理论上是可
如果完整演练失败,请提供一些关于创建http服务器实例的节点代码位置的指导
au
和CLI非常棒,但它们隐藏了许多重要信息。简单的回答是,您不需要这样做
虽然理论上是可能的,但这比仅仅解决CORS问题和使用单独的Web API服务器要求更高,用处更小。只有当您知道如何在客户机和服务器上处理COR,并且知道您不会想到提出这个问题时,这一点才是显而易见的
为了帮助迷路的人沿着这条阴暗的路标前行,下面介绍如何在9000上与Aurelia客户一起处理IIS7 MVC/WepApi2的CORS
服务器
将其作为web API项目根目录下web.config
文件的
部分的子项放入
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
</customHeaders>
</httpProtocol>
下面是web服务的外观。有一个LINQ2SQL模型支持它,为了简洁起见,我省略了它
using Newtonsoft.Json;
using System.Linq;
using System.Reflection;
using System.Web.Http;
namespace DAL3.Controllers
{
public class FormController : ApiController
{
// POST: api/Form
public object Post([FromBody]JsonRequest jsr)
{
var T = GetType();
var M = T.GetMethod(jsr.Command, BindingFlags.NonPublic | BindingFlags.Instance);
var parms = new object[] { jsr.UID, jsr.Raw };
if (M == null) return string.Format("M is null (\"{0}\")",jsr.Command);
if (parms == null) return "parms is null";
return M.Invoke(this, parms);
}
object Get(int UID, string Raw)
{
var dc = new Models.FormsDataContext();
if (string.IsNullOrEmpty(Raw))
{
return dc.Forms.Where(x => x.FormEngine == true);
}
else
{
var id = JsonConvert.DeserializeObject<GetParams>(Raw).Id;
return dc.Forms.Where(x => x.FormID == id);
}
}
}
//this class describes how to parse the parameters for Get
class GetParams
{
public int Id { get; set; }
}
//if you defined some other method Quux that takes parameters
//create a QuuxParams class that matches what JS sends
}
然后将其添加到aurelia.json中的供应商包依赖项中。您不需要对象,只需要双引号中的名称,并根据有效的JSON语法使用尾随逗号
在代码中,您需要导入它
import {HttpClient} from 'aurelia-http-client';
下面是一个示例,在一个名为testserver的框中,一个名为DAL3的Web应用程序中,有一个名为Form的Web API服务
let foo = {
UID: 18974,
Command: "Get",
Raw: null
}
let content = "UID=" + foo.UID + "&Command=" + foo.Command + "&Raw=" + JSON.stringify(foo.Raw)
let client = new HttpClient();
let req = client.createRequest("http://testserver/DAL3/api/Form")
.asPost()
.withHeader("Content-Type","application/x-www-form-urlencoded")
.withContent(content)
.send()
.then(res => {
console.log("Hurrah we have a response!");
});
警告
以下任何一项都会导致使用动词选项的“飞行前”请求,这将导致失败
- 添加非标准标头
- 使用除
或text/plain
application/x-www-form-urlencoded
- 使用GET或POST以外的动词
对象
foo
根的三个属性是URL编码的,并用符号分隔,如上面的示例代码所示。Raw可以包含一个对象,甚至可以包含一个对象的有向无环图。JSON.stringify可以正确处理这两种情况。Null将解析为空字符串,但URL编码的解码将生成Null,这样就可以了;重要的是,原始参数应该存在,以满足另一端的Web API签名匹配。您找到了吗?这是一个很难回答的问题。获取microsoft服务器。设置iis以将虚拟目录指向aurelia应用程序,并将应用程序指向web api应用程序。其中的aurelia和web api部分完全解耦,关于如何独立完成这两项任务,有很多资源。@MatthewJamesDavis-我尝试了这个选项,虽然我可以让它工作,但我更喜欢使用au run--watch
查看BrowserSync的优点,因此根据我的回答,有必要解决CORS问题。@Larsi-是和否。我找到了一个解决方案满意,我在下面的回答中描述。
import {HttpClient} from 'aurelia-http-client';
let foo = {
UID: 18974,
Command: "Get",
Raw: null
}
let content = "UID=" + foo.UID + "&Command=" + foo.Command + "&Raw=" + JSON.stringify(foo.Raw)
let client = new HttpClient();
let req = client.createRequest("http://testserver/DAL3/api/Form")
.asPost()
.withHeader("Content-Type","application/x-www-form-urlencoded")
.withContent(content)
.send()
.then(res => {
console.log("Hurrah we have a response!");
});