asp.net core mvc和angular项目的一些问题
最近公司布置任务,用asp.net core mvc和angular改写原来的一个用Silverlight做的项目。从来没搞过,找了两本书看了一天,又看了一天代码,大致心里有底了,就开始动手。没想到一上来就碰到了头痛的问题。
首先是第一次调试后,修改了typescript,却不会自动编译。花了不少功夫才明白,原来不要用缺省的IISExpress,另外建了个调试profile,关键是类型设为Project,这下就方便了。F5调试后,随时修改template或者typescript,马上就自动重新编译。
第二个问题是无法从asp.net core mvc做的web api取到数据。stackoverflow上的一条回答严重误导了我。它说web api和angular不能发布到同一个端口。结果折腾了半天还是不行。用ng serve来加载angular网页,可以从web api取到数据,但以Release模式发布到IIS上就不行了。怀疑是跨域即CORS的问题,但怎么设也不通。折腾了半天,最后用Debug模式发布,可以取到数据了。但是,项目中要求和win form通信。本来win form中使用WebBrowser控件来访问Silverlight,因为WebBrowser控件默认的模式是IE 7.0,而angular不支持IE 7.0,所以无法显示。通过设置注册表,设定为仿真IE 11,但还是无法显示。如果用其它控件,CefSharp可以显示。问题是win form项目需要以Click-once方式部署,而过去和CefSharp这个控件打过交道,Click-once部署时无法将所需dll文件打包进去。查了下资料,现在似乎可以了。但鉴于过去的痛苦经验,不想试。
本来以为很简单的事情,却老是搞不定。最后通过console.log调试,才发现其实是路由问题。以前做过asp.net mvc 1.0,所以知道路由是怎么回事,加了条web api的路由,马上就顺利取到了数据。用WebBrowser控件访问,也成功了。
这下终于明白几点:
1.Debug模式下,缺省是用angular cli来加载angular,运行在和wep api不同的端口,而WebBrowser控件骨子里是IE 7.0,可能不支持CORS,所以访问失败。
2.Release模式下,是用IIS加载静态文件index.html。如果不给web api加路由,所有对/api/。。。路径的访问即调用web api都被转到index.html,所以取不到数据。加一条路由,就能顺利访问/api/ 下面的web api方法。这样,asp.net core mvc做的web api和angular发布到同一端口,和平共处。又因为是同一端口,没有CORS的问题,所以WebBrowser控件可以顺利访问。也就是说,如果通过WebBrowser控件访问angular,必须以Release模式,将web api和angular发布到同一端口,然后为web api加条路由。
第三个问题是如何从angular访问win form里的C#方法。
以前是在C#里,将一个类加上ComVisible(true)属性,然后把这个对象赋给WebBrowser控件的ObjectForScripting属性,就可以在javascript里,通过window.external.<方法名>来调用了。但是在angular里却不行。也花了点时间,在stackoverlow上找到一条回答,有启发。最后发现应该这样做:
1. index.html里的head部分里加一句<script src="winformCaller.js" ></script>
2.这个winformCaller.js里:
function testCall(arg) {
if (typeof(window.external.foo) !== "undefined") {
window.external.foo(arg);
}
}
3. angular里,用一个javascript文件(不是typescript),这样调用:
export function callWinfom(arg) {
if (typeof(testCall) !== "undefined") {
testCall(arg);
}
}
然后其它的typescript可以通过import这个js文件来调用。
4. 在angular.json文件里,把这个winformCaller.js加到assets一栏。
至于从win form里访问typescript,这样做:
1. webBrowserControl1.InvokeScript("callAngularFromWinform", parameters);
2. 在index.html的body末尾,加一句:
<script src='callAngular.js' ></script>
3.callAngular.js:
function callAngularFromWinform(arg) {
window.callAngular(arg);
}
4. typescript里:
window["callAngular"] = (arg) => {
//做些事情
};
5.同样, 在angular.json文件里,把这个callAngular.js加到assets一栏。
我的理解是因为typescript编译后,函数名字都改了,所以直接InvokeScript不行。
另外值得一提的是这里的 if (typeof(testCall) !== "undefined"),容易误写为if (testCall !== undefined) ,这样写,如果testCall没有参数,倒也行,但这就给人以成功的错误假象。如果testCall有参数,就不正常了。如果不知道这个问题,也要花不少时间调试才能解决。这固然和javascript的设计缺陷有关,或者说这不是javascript的good parts,但必须了解。
解决了部署以及和win form双向通信的问题,剩下的就感觉简单多了,用了一天时间,就改写了全部业务逻辑代码,再花了几天调试界面,就大功告成。
asp.net core mvc和angular项目的一些问题的更多相关文章
- ASP.NET CORE MVC 2.0 项目中引用第三方DLL报错的解决办法 - InvalidOperationException: Cannot find compilation library location for package
目前在学习ASP.NET CORE MVC中,今天看到微软在ASP.NET CORE MVC 2.0中又恢复了允许开发人员引用第三方DLL程序集的功能,感到甚是高兴!于是我急忙写了个Demo想试试,我 ...
- ASP.NET Core Web API + Angular 仿B站(一) 目的分析以及创建 WebAPI + Angular7 项目
前言: 本系列文章主要为对所学 Angular 框架的一次微小的实践,对 b站页面作简单的模仿. 本系列文章主要参考资料: 微软文档: https://docs.microsoft.com/zh-cn ...
- 基于 Asp.Net Core MVC 的 Angular4 SSR 英雄指南
为啥有这篇文章 在之前,类似 Angular.React.Vue 之类的前端框架的一个痛点就是无法在服务端提前把网页内容写入到网页中再发回浏览器,这给网站的 SEO 增加了不少困难,因为爬虫爬到的页面 ...
- 如何在多个项目中分离Asp.Net Core Mvc的Controller和Areas
前言 软件系统中总是希望做到松耦合,项目的组织形式也是一样,本篇文章将介绍在ASP.NET CORE MVC中怎么样将Controller与主网站项目进行分离,并且对Areas进行支持. 实践 1.新 ...
- 使用Asp.Net Core MVC 开发项目实践[第五篇:缓存的使用]
项目中我们常常会碰到一些数据,需要高频率用到但是又不会频繁变动的这类,我们就可以使用缓存把这些数据缓存起来(比如说本项目的导航数据,帖子频道数据). 我们项目中常用到有Asp.Net Core 本身提 ...
- 使用Asp.Net Core MVC 开发项目实践[第一篇:项目结构说明]
先从下图看整体项目结构: Mango.Manager: 为后台管理项目 Mango.Web: 为前台项目 Mango.Framework.Core: 为常用的基础操作类项目 Mango.Framewo ...
- ASP.NET CORE MVC 2.0 如何在Filter中使用依赖注入来读取AppSettings,及.NET Core控制台项目中读取AppSettings
问: ASP.NET CORE MVC 如何在Filter中使用依赖注入来读取AppSettings 答: Dependency injection is possible in filters as ...
- 从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板
标题:从零开始实现ASP.NET Core MVC的插件式开发(二) - 如何创建项目模板 作者:Lamond Lu 地址:https://www.cnblogs.com/lwqlun/p/11155 ...
- ASP.NET Core MVC+EF Core项目实战
项目背景 本项目参考于<Pro Entity Framework Core 2 for ASP.NET Core MVC>一书,项目内容为party邀请答复. 新建项目 本项目开发工具为V ...
随机推荐
- vs code的使用(一) Format On Paste/Format On Save/ Format On Type
很多经典的问题可以搜索出来,但是一些很小的问题网上却没有答案 (这是最令人发狂的,这么简单,网上居然连个相关的信息都没有给出) (就比如我想保存后自动格式化,但网上的大部分都是如何取消保存后自动格式化 ...
- Html笔试复习
掌握学习技巧,提高学习质量 学习目标:熟练掌握Html笔试复习题 已掌握目标:Html笔试复习题掌握95% 未完成目标:个别题因粗心造成错误,因选项意思不懂出错 解决方案:了解原因,因错出方案,充分利 ...
- 重学数据结构(三)——使用单链表实现LRU淘汰缓存机制
使用单链表实现LRU(Least Recently Used)淘汰缓存机制 需求:存在一个单链表,在单链表尾部的都是越早之前添加的元素. 当元素被访问到时,会添加进缓存(也就是这个单链表中). 如果这 ...
- 如何获取论文的 idea
知乎上有一个提问"计算机视觉领域如何从别人的论文里获取自己的idea?" 非常有意思,这里也总结下: Cheng Li的回答:找40篇比较新的paper,最好是开源的.你能看懂的. ...
- GridMask:一种数据增强方法
GridMask Data Augmentation, ARXIV 2020 代码地址:https://github.com/akuxcw/GridMask 这篇论文提出了一种简单的数据增强方法,在图 ...
- ELK5.6.4+Redis+Filebeat+Nginx(CentOS7.4)
下载地址: Elasticsearhc: https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.4.tar.gz ...
- Java中包装类Test类测试出错的解决方法(JUnit5)
import org.junit.jupiter.api.Test; public class TestJunit { public static void main(String[]args) { ...
- 环境篇:DolphinScheduler-1.3.1安装部署及使用技巧
环境篇:DolphinScheduler-1.3.1安装部署 1 配置jdk JDK百度网盘:https://pan.baidu.com/s/1og3mfefJrwl1QGZGZDZ8Sw 提取码:t ...
- 从0到1:开启CAN通信学习(一)
1 初识CAN通信 说起CAN通信,可能很多人都比较陌生,但实际上我们却一直在和它打交道.随着家用汽车的普及,我们开车过程中的每次刹车.每次踩油门,甚至每次的开车门.开车窗,其实都是CAN通信的应用 ...
- Maven——软件开发中一个神奇的项目管理工具
由于本人是从c++转入从事JAVA工作的 所以很多东西要从头学起,相信有很多跟我一样的人吧,那么我们一起来学习. 今天我们一起来认识下Maven这个工具,很多人可能会问题了,为什么说是工具呢?不是写代 ...