c# - 如何让 Nswag 生成的 api 客户端停止产生对象引用错误?
问题描述
我有一个需要模拟的遗留服务,它使用 Soap 作为消息格式。不幸的是,由于各种情况,我坚持使用 asmx 和 .Net Framework(由于它的 Soap 处理能力)
我的问题是我现在需要从服务中调用某个 API,并且使用 NSWAG 自动生成客户端 api,我发现当我尝试调用它时,它给出了 500 错误。这不一定是一个问题,因为我现在有点期待。
问题是,当它作为 500 处理的一部分抛出自动生成的 ApiException 消息时,它会跳转到响应和客户端的“最终”部分,然后只是抛出一个对象引用异常......某处。
异常中几乎没有任何细节,唯一感兴趣的(我认为)是它说“这个异常最初是在这个调用堆栈中引发的:System.Web.ThreadContext.AssociateWithCurrentThread(bool)”
我有点不知道从哪里开始,但我希望这是一个足够普遍的问题,在某个地方有解决方案!
[编辑 - 更新以包含代码]
public System.Threading.Tasks.Task<SomeDto> RetrieveAsync(string someIdentifier, string includePermissibleActions)
{
return RetrieveAsync(someIdentifier, includePermissibleActions, System.Threading.CancellationToken.None);
}
public async System.Threading.Tasks.Task<SomeDto> RetrieveAsync(string someIdentifier, string includePermissibleActions, System.Threading.CancellationToken cancellationToken)
{
if (someIdentifier == null)
throw new System.ArgumentNullException("someIdentifier");
var urlBuilder_ = new System.Text.StringBuilder();
urlBuilder_.Append(BaseUrl != null ? BaseUrl.TrimEnd('/') : "").Append("/api/v1/someName/{someIdentifier}?");
urlBuilder_.Replace("{someIdentifier}", System.Uri.EscapeDataString(ConvertToString(someIdentifier, System.Globalization.CultureInfo.InvariantCulture)));
if (includePermissibleActions != null)
{
urlBuilder_.Append(System.Uri.EscapeDataString("includePermissibleActions") + "=").Append(System.Uri.EscapeDataString(ConvertToString(includePermissibleActions, System.Globalization.CultureInfo.InvariantCulture))).Append("&");
}
urlBuilder_.Length--;
var client_ = _httpClient;
var disposeClient_ = false;
try
{
using (var request_ = new System.Net.Http.HttpRequestMessage())
{
request_.Method = new System.Net.Http.HttpMethod("GET");
PrepareRequest(client_, request_, urlBuilder_);
var url_ = urlBuilder_.ToString();
request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute);
PrepareRequest(client_, request_, url_);
var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false);
var disposeResponse_ = true;
try
{
var headers_ = System.Linq.Enumerable.ToDictionary(response_.Headers, h_ => h_.Key, h_ => h_.Value);
if (response_.Content != null && response_.Content.Headers != null)
{
foreach (var item_ in response_.Content.Headers)
headers_[item_.Key] = item_.Value;
}
ProcessResponse(client_, response_);
var status_ = (int)response_.StatusCode;
if (status_ == 200)
{
var objectResponse_ = await ReadObjectResponseAsync<SomeDto>(response_, headers_).ConfigureAwait(false);
if (objectResponse_.Object == null)
{
throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null);
}
return objectResponse_.Object;
}
else
if (status_ == 401)
{
string responseText_ = (response_.Content == null) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
throw new ApiException("Unauthorized", status_, responseText_, headers_, null);
}
else
if (status_ == 403)
{
string responseText_ = (response_.Content == null) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
throw new ApiException("Forbidden", status_, responseText_, headers_, null);
}
else
if (status_ == 404)
{
string responseText_ = (response_.Content == null) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
throw new ApiException("NotFound", status_, responseText_, headers_, null);
}
else
if (status_ == 500)
{
string responseText_ = (response_.Content == null) ? string.Empty : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
throw new ApiException("InternalServerError", status_, responseText_, headers_, null);
}
else
{
var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false);
throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null);
}
}
finally
{
if (disposeResponse_)
response_.Dispose();
}
}
}
finally
{
if (disposeClient_)
client_.Dispose();
}
}
解决方案
推荐阅读
- swift - 如何执行没有/不需要响应正文的 URLRequest?
- css - 再次单击时如何关闭手风琴菜单
- python - Python CSV 解析“§”字符
- angular - 单击 Microsoft Edge 中的按钮时 Angular 应用程序重新启动
- javascript - 在模态中保持制表符 - :first-child 和 :last-child 伪选择器关系
- grafana - HO 修复“json:无法将字符串解组到 Go struct 字段 Event.No. uint64 类型的排队事件”
- c# - 类比较器
: IComparer.Compare 的显式实现存在的目的 - java - Spring boot - 我如何在 Spring 和 Mongo 中进行聚合和排序?
- kibana - 有没有办法为 Kibana 数据表可视化添加标题?
- bash - 通过重命名将本地文件夹中的文件复制到 gcs