Logo

XOYOZO.NET

大家在看

Angulr 实战笔记 发布于 5 年前
4190 次阅读
5170 次阅读
日历控件用法(Calendar) 发布于 13 年前
3284 次阅读
749 次阅读

近期热门

本文写于 2021 年 7 月。

WebBrowser 不能改用 Chrome 内核。

在 .NET Frameworks 和 .NET Core 年代,常用的第三方组件有:WebKit.NET、CefSharp 等。

而并未找到适用于 .NET 5 的成熟的 Chromium 内核的浏览器组件。

不过还是推荐一款微软官方出品的 WebView2,需要安装 Microsoft Edge Canary 才能正常运行。


  1. HttpHelper类:

    using System;
    using System.Collections.Specialized;
    using System.IO;
    using System.Net;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        public static class HttpHelper
        {
            private static readonly Encoding DEFAULTENCODE = Encoding.UTF8;
    
            /// <summary>
            /// HttpUploadFile
            /// </summary>
            /// <param name="url"></param>
            /// <param name="file"></param>
            /// <param name="data"></param>
            /// <returns></returns>
            public static string HttpUploadFile(string url, string file, NameValueCollection data)
            {
                return HttpUploadFile(url, file, data, DEFAULTENCODE);
            }
    
            /// <summary>
            /// HttpUploadFile
            /// </summary>
            /// <param name="url"></param>
            /// <param name="file"></param>
            /// <param name="data"></param>
            /// <param name="encoding"></param>
            /// <returns></returns>
            public static string HttpUploadFile(string url, string file, NameValueCollection data, Encoding encoding)
            {
                return HttpUploadFile(url, new string[] { file }, data, encoding);
            }
    
            /// <summary>
            /// HttpUploadFile
            /// </summary>
            /// <param name="url"></param>
            /// <param name="files"></param>
            /// <param name="data"></param>
            /// <returns></returns>
            public static string HttpUploadFile(string url, string[] files, NameValueCollection data)
            {
                return HttpUploadFile(url, files, data, DEFAULTENCODE);
            }
    
            /// <summary>
            /// HttpUploadFile
            /// </summary>
            /// <param name="url"></param>
            /// <param name="files"></param>
            /// <param name="data"></param>
            /// <param name="encoding"></param>
            /// <returns></returns>
            public static string HttpUploadFile(string url, string[] files, NameValueCollection data, Encoding encoding)
            {
                string boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");
                byte[] boundarybytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "\r\n");
                byte[] endbytes = Encoding.ASCII.GetBytes("\r\n--" + boundary + "--\r\n");
    
                //1.HttpWebRequest
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
                request.ContentType = "multipart/form-data; boundary=" + boundary;
                request.Method = "POST";
                request.KeepAlive = true;
                request.Credentials = CredentialCache.DefaultCredentials;
    
                using (Stream stream = request.GetRequestStream())
                {
                    //1.1 key/value
                    string formdataTemplate = "Content-Disposition: form-data; name=\"{0}\"\r\n\r\n{1}";
                    if (data != null)
                    {
                        foreach (string key in data.Keys)
                        {
                            stream.Write(boundarybytes, 0, boundarybytes.Length);
                            string formitem = string.Format(formdataTemplate, key, data[key]);
                            byte[] formitembytes = encoding.GetBytes(formitem);
                            stream.Write(formitembytes, 0, formitembytes.Length);
                        }
                    }
    
                    //1.2 file
                    string headerTemplate = "Content-Disposition: form-data; name=\"{0}\"; filename=\"{1}\"\r\nContent-Type: application/octet-stream\r\n\r\n";
                    byte[] buffer = new byte[4096];
                    int bytesRead = 0;
                    for (int i = 0; i < files.Length; i++)
                    {
                        stream.Write(boundarybytes, 0, boundarybytes.Length);
                        string header = string.Format(headerTemplate, "file" + i, Path.GetFileName(files[i]));
                        byte[] headerbytes = encoding.GetBytes(header);                    
                        stream.Write(headerbytes, 0, headerbytes.Length);
                        using (FileStream fileStream = new FileStream(files[i], FileMode.Open, FileAccess.Read))
                        {                        
                            while ((bytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                            {
                                stream.Write(buffer, 0, bytesRead);
                            }
                        }
                    }
    
                    //1.3 form end
                    stream.Write(endbytes, 0, endbytes.Length);
                }
                //2.WebResponse
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                using (StreamReader stream = new StreamReader(response.GetResponseStream()))
                {
                    return stream.ReadToEnd();
                }
            }
        }
    }
  2. 调用示例:

    using System;
    using System.Collections.Specialized;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                NameValueCollection data = new NameValueCollection();
                data.Add("name", "木子屋");
                data.Add("url", "http://www.mzwu.com/");
                Console.WriteLine(HttpHelper.HttpUploadFile("http://localhost/Test", new string[] { @"E:\Index.htm", @"E:\test.rar" }, data));
    
                Console.ReadKey();
            }
        }
    }

未能连接到远程计算机。请确保在远程计算机上安装了 Web Deploy 并启动了所需的进程(“Web Management Service”)。  在以下位置了解更多信息: https://go.microsoft.com/fwlink/?LinkId=221672#ERROR_DESTINATION_NOT_REACHABLE。

远程服务器返回错误: (404) 未找到。

确保远程服务器上已安装 Web 服务管理,并使用以下命令启动服务:

net start wmsvc & net start msdepsvc


已使用指定的进程(“Web Management Service”)连接到远程计算机,但未能验证服务器的证书。如果你信任该服务器,请再次连接并允许不信任的证书。  在以下位置了解更多信息: https://go.microsoft.com/fwlink/?LinkId=221672#ERROR_CERTIFICATE_VALIDATION_FAILED。

基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。

根据验证过程,远程证书无效。


image.pngimage.pngimage.png

菜单 - 工具 - 选项 - 项目和解决方案 - ASP.NET Core - “自动生成和刷新”选项

image.png

打开注册表编辑器(regedit)

展开到:\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\CloudStore\Store\DefaultAccount\Cloud

删除:

default$windows.data.bluelightreduction.bluelightreductionstate

default$windows.data.bluelightreduction.settings

重启计算机

image.png

  1. 打开浙江省通信管理局网站

  2. 点击“办事服务”

  3. 滚动到底部,在“下载专栏”中找到“浙江省网站备案注销申请表”

  4. 下载浙江省网站备案注销申请表,按填表说明填写表格、准备资料,邮寄到指定地址。

  5. 管局将在收到资料到 7 个工作日内进行处理。

省通管局备案咨询电话:0571-87078277

本文更新于:2021年6月

“Web 部署”方式发布 ASP.NET Core 网站项目可解决发布到本地文件夹再通过 FTP 上传到 IIS 中会遇到的文件被锁定/占用的问题。相对于手动停止网站甚至结束进程来说,Web 部署更为方便。

  1. 服务器管理器 - 添加角色和功能 - 服务器角色 - Web 服务器(IIS) - 管理工具 - 管理服务

    image.png

  2. 安装 Web Deploy

    Web 平台安装程序 中搜索安装

    image.pngimage.png

  3. 在“服务”中设置“Web Management Service”自动启用

    image.pngimage.png

  4. IIS 管理器 - 管理服务 - 启用远程连接

    image.pngimage.png

    这里我们不使用 Windows 凭据(本地用户),而使用 IIS 管理器用户。

    端口默认 8172,需要在防火墙中允许该端口。在阿里云 ECS 的安全组规则中添加该端口允许。

    image.pngimage.png

  5. 创建 IIS 管理器用户

    image.png

    打开后右侧添加用户,以“iisWebDeploy”为例

    image.png

  6. 配置 IIS 管理器权限

    选择单个网站

    image.pngimage.png

  7. 给整个网站目录添加 LOCAL SERVICE 的安全控制权限

    image.png

  8. 发布

    image.pngimage.pngimage.pngimage.png

错误Web 部署任务失败。 (无法为指定目录执行操作(“创建文件”)。如果服务器果管理员没有为你使用的用户凭据授予执行此操作的权限,则会发生这种情况。

  在以下位置了解更多信息: http://go.microsoft.com/fwlink/?LinkId=221672#ERROR_INSUFFICIENT_ACCESS_TO_SITE_FOLDER。  在以下位置了解更多信息: https://go.microsoft.com/fwlink/?LinkId=221672#ERROR_INSUFFICIENT_ACCESS_TO_SITE_FOLDER。)

解决方法:设置该文件或网站目录的 LOCAL SERVICE 用户完全控制权限。

按产品类型查询:费用 - 费用分析,右侧可筛选产品,可按月按天查询,自动合计

按实例查询:费用 - 费用账单,搜索实例ID,按月查询

另:已通过提交工单确认无法查询 OSS 按 Bucket 的账单及 CDN 按域名的账单。

https://3gimg.qq.com/lightmap/v1/wxmarker/index.html?marker=coord:30.036977,121.154534;title:余姚市政府;addr:宁波市余姚市北兰江路1号

命名空间“X.PagedList.Mvc.Core”中不存在类型或命名空间名“Common”(是否缺少程序集引用?)

X.PagedList.Mvc.Core.Common.PagedListRenderOptions

X.PagedList.Web.Common.PagedListRenderOptionsBase

改为

X.PagedList.Web.Common.PagedListRenderOptions

undefined_swagger_json.png

错误原因可直接访问 /swagger/v1/swagger.json 找到。

Nuget 包:System.Runtime.Caching

依赖注入:

public class HomeController : Controller
{
    private IMemoryCache _cache;

    public HomeController(IMemoryCache memoryCache)
    {
        _cache = memoryCache;
    }

定义键:

public static class CacheKeys
{
    public static string Entry { get { return "_Entry"; } }
}

赋值与取值:

public IActionResult CacheTryGetValueSet()
{
    DateTime cacheEntry;

    // 尝试从缓存获取,若获取失败则重新赋值
    if (!_cache.TryGetValue(CacheKeys.Entry, out cacheEntry))
    {
        // 新的内容
        cacheEntry = DateTime.Now;

        // 缓存选项
        var cacheEntryOptions = new MemoryCacheEntryOptions()
            // Keep in cache for this time, reset time if accessed.
            .SetAbsoluteExpiration(TimeSpan.FromSeconds(3));

        // 保存到缓存中
        _cache.Set(CacheKeys.Entry, cacheEntry, cacheEntryOptions);
    }

    return View("Cache", cacheEntry);
}

注意:

.SetAbsoluteExpiration() 用于设置绝对过期时间,它表示只要时间一到就过期

.SetSlidingExpiration() 用于设置可调过期时间,它表示当离最后访问超过某个时间段后就过期

// 4月 2021
d1 = DateTime.Now.ToString("MMM yyyy"),
// 四月 2021
d2 = DateTime.Now.ToString("MMMM yyyy"),
// Apr 2021
d3 = DateTime.Now.ToString("MMM yyyy", System.Globalization.CultureInfo.CreateSpecificCulture("en-US")),
// April 2021
d4 = DateTime.Now.ToString("MMMM yyyy", System.Globalization.CultureInfo.CreateSpecificCulture("en-US")),


1 2 3 4 5