1、浏览器跨域调起本地写的http服务,报错
Failed to load http://x.x.x.x:xxx: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://x.x.x.x' is therefore not allowed access
这个貌似是跟服务端有关,只需要本地的http服务的响应加上头部
Access-Control-Allow-Origin | * |
表示服务端允许跨域请求
Access-Control-Allow-Origin - HTTP | MDN
2、关于本地启动http监听服务,如果报错需要管理员权限,需要检查你的监听连接
- httpObj = new HttpListener();
- httpObj.AuthenticationSchemes = AuthenticationSchemes.Anonymous;
- httpObj.Prefixes.Add("http://+:8080/test/");
如果监听的是 http://+:8080,如果带上了加号,就需要管理员权限执行,不然报错
- 当前时间:2023/4/17 15:13:15
- 异常信息:拒绝访问。
- 异常对象:System
- 调用堆栈:
- 在 System.Net.HttpListener.AddAllPrefixes()
- 在 System.Net.HttpListener.Start()
- 触发方法:Void AddAllPrefixes()
解决办法:
① 管理员权限运行exe
② 使用127.0.0.1代替+号
③ 加白接口
管理员执行命令
netsh http add urlacl url=http://127.0.0.1:80/test user=Everyone
中间的ip、端口、接口可以换,相当于是加白
删除加白使用
netsh http delete urlacl url=http://127.0.0.1:80/test
查看当前加白名单
netsh http show urlacl
.net - c#: HttpListener setup on https without admin rights - Stack Overflow
3、C# 请求的操作需要提升
说明你启动的应用需要管理员权限
如果只需要将A应用标记为需要管理员权限才能启动(图标上有个盾),需要修改manifest,参照
C#程序设置以管理员权限运行_小鹰信息技术服务部的博客-CSDN博客_c# 管理员权限
如果说,我先启动一个A应用(非管理员权限启动),我想要A应用(以管理员权限)拉起B应用,因为B应用需要管理员权限,就需要在启动信息(A应用使用Process.start时)中添加
Verb = "runas"
但是不能选择隐藏窗口,即下面这个选项要打开,下面选项不能为false
UseShellExecute = true
C# 调用Process.Start 请求的操作需要提升解决方案|C/S框架网
c# - Elevating privileges doesn't work with UseShellExecute=false - Stack Overflow
4、使用 visual studio installer 打包时,设置安装时启动某个应用
c# - Visual Studio Installer > How To Launch App at End of Installer - Stack Overflow
右键安装项目,view->自定义启动条件 ,右键commit添加文件,这些文件得是安装包里带的(添加安装包文件,前面选择 add-> 文件),这个文件的 InstallerClass 属性需要为 false
5、C#程序后台启动
①应用A启动应用B,希望B不要出现命令行的窗口,需要在A设置B的命令行的启动信息
- public static void test(string fileName, string arguments)
- {
- Process p = new Process();
- p.StartInfo = new ProcessStartInfo(fileName);
- p.StartInfo.CreateNoWindow = true;
- p.StartInfo.UseShellExecute = false;
- p.StartInfo.Arguments = arguments;
- p.Start();
- }
②我想启动A的时候就不出现命令行窗口
需要右键项目属性,检查是不是windows应用程序,如果是控制台程序必弹命令行窗口
或者使用下面代码在启动后控制台程序后,隐藏黑框
- class Program
- {
- [DllImport("user32.dll")]
- private static extern int ShowWindow(int Handle, int showState);
-
- [DllImport("kernel32.dll")]
- public static extern int GetConsoleWindow();
-
- static void Main(string[] args)
- {
- // 隐藏黑框
- int win = GetConsoleWindow();
- ShowWindow(win, 0);
- }
- }
6、http请求超时
我用C#写的http客户端请求老是超时,开始我还以为是服务器问题,但是postman不会,原因好像是要设置Expect100Continue
request.ServicePoint.Expect100Continue = false;
C# HttpWebRequest 请求遇到最坑(史上最坑)的一个问题,分析加解决方案 - 知乎
(此外,我另外写了一个http服务端,命令行黑框启动的,每次服务端阻塞超时的时候,我就得去黑框按下一个键,就会放开这次阻塞的请求,服了,目前感觉像是机器卡顿加反复请求的时候才会出现上面的情况,原因目前不清楚)
7、Dictionary类型的变量不能 add 相同的 key,否则阻塞或者报错
- System.ArgumentException
- HResult=0x80070057
- Message=已添加了具有相同键的项。
- Source=mscorlib
- StackTrace:
- at System.ThrowHelper.ThrowArgumentException(ExceptionResource resource)
- at System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
- at test.Program.Main(String[] args) in
- Program.cs:line 47