Unity(C#)尝试连接Azure时抛出NotImplementedException问题求助
错误根因
你遇到的报错是Unity 2019版本自带的Mono运行时对System.Net.Http.HttpClientHandler的实现不全,MaxConnectionsPerServer属性未做实现,而你使用的Azure Storage Blob SDK在初始化默认传输链路时会主动调用该属性,因此仅在Unity环境触发异常,在标准.NET控制台环境运行正常。
修复方案
- 方案1:自定义Azure SDK传输链路,绕开默认实现
修改你的DLL代码,手动构造HttpClientTransport,避免SDK自动调用未实现的属性:
using Azure.Core.Pipeline; using Azure.Storage.Blobs; public class UnityToAzureConnection { private readonly static string m_connectionString = "CENSORED"; // 注意把async void改成async Task,避免Unity异步吞异常 public static async Task CreateConnection(string _path, string _fileName) { // 手动构造HttpClientHandler,不依赖SDK的默认创建逻辑 var handler = new HttpClientHandler(); var client = new HttpClient(handler); var transport = new HttpClientTransport(client); // 配置BlobClientOptions使用自定义传输 var options = new BlobClientOptions() { Transport = transport }; BlobServiceClient blobServiceClient = new BlobServiceClient(m_connectionString, options); // 容器名必须全小写,符合Azure命名规范 BlobContainerClient containerClient = await blobServiceClient.CreateBlobContainerAsync("imagetest"); BlobClient blobClient = containerClient.GetBlobClient(_fileName); using (FileStream _fs = File.Open(Path.Combine(_path, _fileName), FileMode.Open)) { await blobClient.UploadAsync(_fs, true); } } }
调用该方法时如果是在Unity生命周期内,可通过协程包裹异步等待逻辑执行,避免主线程阻塞。
方案2:调整Unity Player配置
打开Unity编辑器的Edit > Project Settings > Player > Other Settings,修改以下配置:- 将
Api Compatibility Level设置为.NET 4.x - 将
Http Implementation从默认的UnityWebRequest改为.NET Core
修改后重新导入依赖DLL即可。
- 将
方案3:降级Azure Storage SDK版本
如果上述方案不生效,可将你DLL引用的Azure.Storage.Blobs包降级到12.2.0以下的版本,或者替换为旧版Microsoft.Azure.Storage.Blob包,该版本系列对Unity旧Mono运行时兼容性更好。
额外注意事项
- Unity环境下不要使用
async void定义异步方法,未捕获的异常会直接被静默吞掉,排查难度极高,统一改为async Task返回值。 - Azure Blob容器名必须全小写、不能包含特殊字符,不符合规范的命名会在运行时抛出额外异常。
内容的提问来源于stack exchange,提问作者Michael Duxbury
相关产品推荐
相关产品推荐

