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 ... 
随机推荐
- vue使用select间相互绑定
			让这两个select相互绑定,让roleOptions选取值后,worklist弹出得是roleOptions值 <el-select v-model="postForm.projec ... 
- 工程能力UP | LightGBM的调参干货教程与并行优化
			这是个人在竞赛中对LGB模型进行调参的详细过程记录,主要包含下面六个步骤: 大学习率,确定估计器参数n_estimators/num_iterations/num_round/num_boost_ro ... 
- springboot(三)SpringDataJPA完成CRUD
			参考博客—恒宇少年:https://www.jianshu.com/p/b6932740f3c0 纯洁的微笑:http://www.ityouknow.com/springboot/2016/08/2 ... 
- Nexus安装与迁移
			Maven registry(maven私有仓库) 配置Java export JAVA_HOME=/software/jdk1.7.0_79 export JRE_HOME=${JAVA_HOME} ... 
- Servlet学习之Tomcat secretRequired配置报错问题
			Tomcat secretRequired配置问题 在启动Tomcat时,控制台可能会出现IllegalArgumentException异常,即"AJP连接器配置secretRequire ... 
- 读/写docx文件
			安装 pip install python-docx 1.建立新Word文档 建立新文档需要调用Document对象的save方法,一个Document对象代表一个Word文档,该方法的参数是保存的文 ... 
- Python File writelines() 方法
			概述 writelines() 方法用于向文件中写入一序列的字符串.高佣联盟 www.cgewang.com 这一序列字符串可以是由迭代对象产生的,如一个字符串列表. 换行需要制定换行符 \n. 语法 ... 
- PHP attributes() 函数
			实例 返回 XML 的 body 元素的属性和值: <?php$note=<<<XML<note><to>Tove</to>高佣联盟 www ... 
- CF R638 div2 F Phoenix and Memory 贪心 线段树 构造 Hall定理
			LINK:Phoenix and Memory 这场比赛标题好评 都是以凤凰这个单词开头的 有凤来仪吧. 其实和Hall定理关系不大. 不过这个定理有的时候会由于 先简述一下. 对于一张二分图 左边集 ... 
- 通过缓存Cache记录命中率
			import org.apache.juli.logging.Log; /** * 通过此Cache记录命中率 * @author Administrator * */ public class Lo ... 
