#c# #.net-core #cloudinary
Вопрос:
У меня проблема с использованием Cloudinary в производстве, код, который я вставлю ниже, работает локально, но не работает в производстве.
Локальное использование VS2019 ошибка не отображается, в производстве на поддомене через https эта ошибка возникает.
Контроллер выглядит следующим образом:
using CloudinaryDotNet;
using CloudinaryDotNet.Actions;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using SGVCatalogBE.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace SGVCatalogBE.Controllers
{
public class ProvaController:BaseApiController
{
private readonly IPhotoService _photoService;
public ProvaController(IPhotoService photoService)
{
_photoService = photoService;
}
[HttpPost("add-photo")]
public async Task<ActionResult<ImageUploadResult>> AddPhoto(IFormFile file)
{
Account account = new Account("xxxxxx",
"123456789",
"xxxxxxxxxxxxxxxxxxxxxxx");
Cloudinary cloudinary = new Cloudinary(account);
cloudinary.Api.Secure = true;
var uploadResult = new ImageUploadResult();
if (file.Length > 0)
{
using var stream = file.OpenReadStream();
var uploadParams = new ImageUploadParams
{
File = new FileDescription(file.FileName, stream),
Transformation = new Transformation().Height(500).Width(500).Crop("fill").Gravity("face")
};
try
{
cloudinary.Api.Secure = true;
uploadResult = await cloudinary.UploadAsync(uploadParams);
}
catch (Exception ex)
{
return StatusCode(500, ex);
}
}
return uploadResu<
}
}
}
Возвращенная ошибка выглядит так:
{
"statusCode": null,
"stackTrace": " at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Boolean async, Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)rn at System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)rn at System.Net.Http.HttpConnectionPool.CreateHttp11ConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)rn at System.Net.Http.HttpConnectionPool.GetHttpConnectionAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)rn at System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean async, Boolean doRequestAuth, CancellationToken cancellationToken)rn at System.Net.Http.RedirectHandler.SendAsync(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)rn at System.Net.Http.DiagnosticsHandler.SendAsyncCore(HttpRequestMessage request, Boolean async, CancellationToken cancellationToken)rn at System.Net.Http.HttpClient.SendAsyncCore(HttpRequestMessage request, HttpCompletionOption completionOption, Boolean async, Boolean emitTelemetryStartStop, CancellationToken cancellationToken)rn at CloudinaryDotNet.ApiShared.CallAsync(HttpMethod method, String url, SortedDictionary`2 parameters, FileDescription file, Dictionary`2 extraHeaders, Nullable`1 cancellationToken)rn at CloudinaryDotNet.ApiShared.CallAndParseAsync[T](HttpMethod method, String url, SortedDictionary`2 parameters, FileDescription file, Dictionary`2 extraHeaders, Nullable`1 cancellationToken)rn at SGVCatalogBE.Controllers.ProvaController.AddPhoto(IFormFile file) in C:\Users\Domenico\Desktop\SGVCatalog\SGVCatalogBE\Controllers\ProvaController.cs:line 48",
"message": "The SSL connection could not be established, see inner exception.",
"data": {},
"innerException": {
"ClassName": "System.Security.Authentication.AuthenticationException",
"Message": "The remote certificate is invalid according to the validation procedure: RemoteCertificateNameMismatch",
"Data": null,
"InnerException": null,
"HelpURL": null,
"StackTraceString": " at System.Net.Security.SslStream.SendAuthResetSignal(ProtocolToken message, ExceptionDispatchInfo exception)rn at System.Net.Security.SslStream.ForceAuthenticationAsync[TIOAdapter](TIOAdapter adapter, Boolean receiveFirst, Byte[] reAuthenticationData, Boolean isApm)rn at System.Net.Http.ConnectHelper.EstablishSslConnectionAsyncCore(Boolean async, Stream stream, SslClientAuthenticationOptions sslOptions, CancellationToken cancellationToken)",
"RemoteStackTraceString": null,
"RemoteStackIndex": 0,
"ExceptionMethod": null,
"HResult": -2146233087,
"Source": "System.Private.CoreLib",
"WatsonBuckets": null
},
"helpLink": null,
"source": "System.Net.Http",
"hResult": -2146233087
}
API развернут на сервере с IIS.
Кто-нибудь может помочь мне исправить эту ошибку?
Спасибо
Комментарии:
1. Эта ошибка обычно означает, что ваш сервер не доверяет сертификату Cloudinary. Однако, поскольку Cloudinary подписан доверенным корневым центром сертификации, это, вероятно, означает, что на компьютере, на котором запущено это приложение, нет последнего набора корневых центров сертификации. Возможно, вам потребуется проконсультироваться с вашим ИТ-специалистом по этому вопросу. Или, возможно, у вас есть MITM/прокси-сервер между ними, который перехватывает трафик HTTPS, поэтому сертификат, полученный вашим приложением, от MITM, а не от Cloudinary, отсюда несоответствие имени хоста:
RemoteCertificateNameMismatch
2. Спасибо за ваш комментарий, я позвонил ИТ-менеджеру, который обнаружил, что система веб-защиты блокирует звонки на api.cloudinary.com, мы решили эту проблему. Большое спасибо.