我有這個問題,我需要進行外部 API 呼叫,但是在生產中我必須為 API 呼叫使用證書,而在開發中我真的不需要證書。我想知道如何實作一個解決方案,我可以將生產代碼和開發代碼分開,這樣我就不必注釋掉這部分,也可能忘記更改它。任何提示將不勝感激!
public async Task<GetPersonResponse> PostPerson(PersonDto dto)
{
try {
var httpHandler = new HttpClientHandler();
var certificate = new X509Certificate2(
Path.Join(_certOptions.Path, _certOptions.Name),
_certOptions.Password,
X509KeyStorageFlags.MachineKeySet);
httpHandler.ClientCertificates.Add(certificate);
var client = new HttpClient(httpHandler);
var soapRequest = GenerateRequest(dto);
var request = new HttpRequestMessage() {
RequestUri = new Uri(_options.Value.URL),
Method = HttpMethod.Post,
Content = new StringContent(soapRequest.ToString(), Encoding.UTF8, "text/xml"),
};
var response = await client.SendAsync(request);
}
}
uj5u.com熱心網友回復:
好幾件事會有所幫助。首先,您應該查看HttpClientFactory,它可以讓您傳入 httpclient 并正確配置它 - 現在您正在使用您顯示的代碼泄漏套接字。
對于如何讓代碼處理基于環境改變行為的更普遍的問題,有兩種非常常見的方法。
首先是將行為抽象為每個環境的一個介面和實作。然后根據環境改變實作。因此,對于您的 Web 應用程式,您將根據運行時環境注冊一個特定的實作。然后您的控制器將在其建構式中獲取介面。
第二種方法是傳入具有運行時資訊的配置元素,然后有條件地執行代碼。在這種情況下,控制器將采用建構式中的配置元素。
我會避免使用條件編譯,因為它更難測驗。
uj5u.com熱心網友回復:
您可以使用這樣的條件前處理器 #if #else #endif:
#if DEBUG
Console.WriteLine("Code will executed only in a debug configuration");
#else
Console.WriteLine("Executed if not in a debug configuration");
#endif
uj5u.com熱心網友回復:
你已經擁有你的代碼的條件:
_options.Value.URL
創建一個_options.Value.UseCertificate并if在您的證書代碼周圍放置一個會不會有問題?
uj5u.com熱心網友回復:
另一種方法可能是進行配置設定并使用它來限制證書的使用
開發配置:
<add key="UseCertificate" value="False"/>
產品配置:
<add key="UseCertificate" value="True"/>
條件:
ConfigurationManager.AppSettings["UseCertificate"]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/327286.html
上一篇:Microsoft.SqlServer.Management.Common.ServerConnection建構式不接受SqlConnection,但它應該
