HttpClientBaseAddress가 작동하지 않는 이유는 무엇입니까?
다음 코드를 고려해 보십시오.BaseAddress부분 URI 경로를 정의합니다.
using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://something.com/api");
var response = await client.GetAsync("/resource/7");
}
나는 이것이 수행될 것으로 기대합니다.GET에 대한 요청.http://something.com/api/resource/7하지만 그렇지 않습니다.
검색한 결과 다음과 같은 질문과 답변을 발견했습니다.기본 주소가 있는 HttpClient입니다.제안은 다음과 같습니다./의 끝에BaseAddress.
using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://something.com/api/");
var response = await client.GetAsync("/resource/7");
}
여전히 작동하지 않습니다.다음은 설명서입니다.HttpClient.기본 주소 이게 무슨 일입니까?
4개의 가능한 순열 중에서 다음과 같은 것을 포함하거나 제외하는 것으로 밝혀졌습니다.BaseAddress그리고 URI가 상대적으로 전달되었습니다.GetAsync방법 -- 또는 다른 방법.HttpClient하나의 순열만 작동합니다.파일의 끝에 슬래시를 배치해야 합니다.BaseAddress또한 다음 예제에서와 같이 상대 URI의 시작 부분에 슬래시를 배치해서는 안 됩니다.
using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://something.com/api/");
var response = await client.GetAsync("resource/7");
}
저는 제 질문에 대답했지만, 다시 말하지만, 이 비우호적인 행동은 문서화되지 않았기 때문에 여기서 해결책을 제공해야겠다고 생각했습니다.제 동료와 저는 하루의 대부분을 이 이상함으로 인해 궁극적으로 야기된 문제를 해결하기 위해 보냈습니다.HttpClient.
참조 해결은 RFC 3986 URI(Uniform Resource Identifier): 일반 구문에 의해 설명됩니다.그리고 그것이 정확히 어떻게 작동하는지에 대한 것입니다.기본 URI 경로를 보존하려면 기본 URI 끝에 슬래시를 추가하고 상대 URI 시작에 슬래시를 제거해야 합니다.
기본 URI에 비어 있지 않은 경로가 포함된 경우 병합 절차에서 마지막 부분(마지막 부분 이후)을 삭제합니다./). 관련 섹션:
5.2.3. 경로 병합
위의 유사 코드는 상대 경로 참조를 기본 URI의 경로와 병합하기 위한 "병합" 루틴을 참조합니다.이 작업은 다음과 같이 수행됩니다.
- 기본 URI에 정의된 권한 구성 요소와 빈 경로가 있으면 참조 경로와 연결된 "/"로 구성된 문자열을 반환합니다. 그렇지 않으면
- 기본 URI 경로의 마지막 세그먼트를 제외한 모든 세그먼트에 추가된 참조 경로 구성 요소로 구성된 문자열을 반환합니다(즉, 기본 URI 경로의 맨 오른쪽 "/" 뒤에 오는 문자를 제외하거나, "/" 문자가 없는 경우 전체 기본 URI 경로를 제외).
상대 URI가 슬래시로 시작하는 경우 절대 경로 상대 URI라고 합니다.이 경우 병합 절차는 모든 기본 URI 경로를 무시합니다.자세한 내용은 5.2.2를 참조하십시오. 참조 변환 섹션.
httpClient를 사용하는 경우.SendAsync() Get 또는 다른 동사별 메서드에 대한 오버로드와 같은 상대적 Uris를 제공하기 위한 문자열 오버로드가 없습니다.
그러나 UriKind를 제공하여 상대 Uri를 생성할 수 있습니다.두 번째 모수로서의 상대성
var httpRequestMessage = new HttpRequestMessage
{
Method = httpMethod,
RequestUri = new Uri(relativeRequestUri, UriKind.Relative),
Content = content
};
using var httpClient = HttpClientFactory.CreateClient("XClient");
var response = await httpClient.SendAsync(httpRequestMessage);
var responseText = await response.Content.ReadAsStringAsync();
저는 또한 같은 문제에 직면했습니다.BaseAddress사용하지 않기로 결정했습니다.BaseAddress가장 간단한 해결책은 단순한 한 줄 추가입니다.
Uri GetUri(string path) => new Uri("http://something.com/api" + path);
그러면 코드는 다음과 같습니다.
Uri GetUri(string path) => new Uri("http://something.com/api" + path);
using (var handler = new HttpClientHandler())
using (var client = new HttpClient(handler))
{
// Remove BaseAddress completely
// client.BaseAddress = new Uri("http://something.com/api");
var response = await client.GetAsync(GetUri("/resource/7"));
}
사용에 대한 장단점을 조사하지 않았습니다.BaseAddress하지만 저에게는 완벽하게 작동합니다.이것이 누군가에게 도움이 되기를 바랍니다.
HTTP 클라이언트에 문제가 발생했습니다. 제안에도 불구하고 인증할 수 없습니다.상대 경로에 '/' 뒤에 붙여야 했습니다.
예.
var result = await _client.GetStringAsync(_awxUrl + "api/v2/inventories/?name=" + inventoryName);
var result = await _client.PostAsJsonAsync(_awxUrl + "api/v2/job_templates/" + templateId+"/launch/" , new {
inventory = inventoryId
});
언급URL : https://stackoverflow.com/questions/23438416/why-is-httpclient-baseaddress-not-working
'programing' 카테고리의 다른 글
| Powershell을 사용하여 한 Azure Keyvault에서 다른 Keyvault로 모든 비밀을 복사하는 방법 (0) | 2023.05.12 |
|---|---|
| 스위프트 3, 스위프트 4 등에서 어떻게 sync, dispatch_async, dispatch_after 등을 디스패치합니까? (0) | 2023.05.12 |
| Mongo C# 드라이버 - 중첩을 사용하여 동적으로 필터 구축 (0) | 2023.05.12 |
| 프로그램이 복구를 시도하지 않아야 하는 예외는 무엇입니까? (0) | 2023.05.12 |
| MongoDB - 집계를 사용하여 배열 해제 및 중복 제거 (0) | 2023.05.07 |