.Net Framework API 文件上传端点:无法使用 Postman 发出请求
.Net Framework API endpoint for file upload: Cannot make a request with Postman
我正在创建一个 .Net 框架(不是 DotNet Core)API 端点来上传文件,但我无法调试来自 Postman 的 Visual Studio 请求中的请求。我的应用程序使用 Swagger,我可以使用 Swagger 发出请求并毫无问题地进行调试,除了使用 Swagger 我无法显示“Select 文件”按钮,所以我正在尝试使用 Postman。
我的方法,虽然还没有完成,看起来是这样的:
[HttpPost]
[Route("UploadVideo")]
public bool UploadVideo([FromBody] JObject pData, [FromUri] string videoTitle, [FromUri] string description,
[FromUri] short enterpriseId, [FromUri] int userId, [FromUri] int applicationId)
{
string lFileBase64 = pData["file"]["File64Code"].ToString();
string lFileName = pData["file"]["FileName"].ToString();
Dictionary<string, string> exportParams = new Dictionary<string, string>();
exportParams.Add("TYPE", ((int)RequestType.UsersImport).ToString());
exportParams.Add("PFK_ENTERPRISE", enterpriseId.ToString());
exportParams.Add("PK_USER", userId.ToString());
exportParams.Add("PK_APPLICATION", applicationId.ToString());
exportParams.Add("FILE_NAME", lFileName);
Models.RequestLog requestLog = new Models.RequestLog();
requestLog.Data = RequestLogService.ParseRequestParams(exportParams);
requestLog.Type = RequestType.UsersImport;
int requestId = RequestLogService.CreateRequestLog(enterpriseId, userId,
Mapper.Map<RequestLog>(requestLog));
if (requestId > 0)
{
//update request status
exportParams.Add("PK_REQUEST", requestId.ToString());
requestLog.Id = requestId;
requestLog.Status = RequestStatus.Sent;
requestLog.Data = RequestLogService.ParseRequestParams(exportParams); ;
RequestLogService.UpdateRequestLog(enterpriseId, userId,
Mapper.Map<RequestLog>(requestLog));
string pCloudStorageAccount = AzureHelper.SelectAzureStorageAccount(enterpriseId);
string pContainer = "docstmp" + AzureStorageSettings.AzureStorageContainer;
MemoryStream myStream = new MemoryStream(Convert.FromBase64String(lFileBase64));
Guid guid = Guid.NewGuid();
lFileName = "UploadVideo_" + enterpriseId.ToString() + "_" + guid.ToString() + ".mp4";
string urlAzure = AzureStorageHelpers.UploadFile(pCloudStorageAccount, pContainer, lFileName, myStream);
exportParams.Add("URL", urlAzure);
requestLog.Data = RequestLogService.ParseRequestParams(exportParams);
RequestLogService.QueueRequest(enterpriseId, userId,
Mapper.Map<RequestLog>(requestLog));
}
else
{
return false;
}
return true;
}
但是这个方法在这里不相关,因为我的问题是 Postman 没有到达终点。
在下面的图片中,您可以看到抛出错误的 Postman 请求的详细信息。
有什么帮助吗?
编辑 1: 从 Swagger 获得的额外信息可能会有帮助。
"/api/Catalogues/UploadVideo":{
"post":{
"tags":[
"Catalogues"
],
"operationId":"Catalogues_UploadVideo",
"consumes":[
"application/json",
"text/json",
"application/x-www-form-urlencoded"
],
"produces":[
"application/json",
"text/json"
],
"parameters":[
{
"name":"pData",
"in":"body",
"required":true,
"schema":{
"type":"object"
}
},
{
"name":"videoTitle",
"in":"query",
"required":true,
"type":"string"
},
{
"name":"description",
"in":"query",
"required":true,
"type":"string"
},
{
"name":"enterpriseId",
"in":"query",
"required":true,
"type":"integer",
"format":"int32"
},
{
"name":"userId",
"in":"query",
"required":true,
"type":"integer",
"format":"int32"
},
{
"name":"applicationId",
"in":"query",
"required":true,
"type":"integer",
"format":"int32"
}
],
"responses":{
"200":{
"description":"OK",
"schema":{
"type":"boolean"
}
}
}
}
}
编辑 2: 已在 Postman 中禁用 SSL 证书验证:
在您的邮递员中,您正在使用 form (body)
发送所有数据。您的端点期望除视频外的所有值都通过 URL 作为查询参数发送。
在 postman 中,将所有值添加到 Params
选项卡,然后将视频添加到 Body
选项卡。
你端点上的属性,你已经说明了这一点。 [FromBody]
表示与 POST
一起发送的表单。 [FromUri]
告诉端点它期望一个值包含在 URL 本身中。
这也在您的 swagger 示例中进行了概述:
正文
"name":"pData",
"in":"body" //<--this
查询
"name":"videoTitle",
"in":"query", //<--this
编辑:
我建议遵循 this MS 文档。使用正确的方法上传大文件。
我正在创建一个 .Net 框架(不是 DotNet Core)API 端点来上传文件,但我无法调试来自 Postman 的 Visual Studio 请求中的请求。我的应用程序使用 Swagger,我可以使用 Swagger 发出请求并毫无问题地进行调试,除了使用 Swagger 我无法显示“Select 文件”按钮,所以我正在尝试使用 Postman。
我的方法,虽然还没有完成,看起来是这样的:
[HttpPost]
[Route("UploadVideo")]
public bool UploadVideo([FromBody] JObject pData, [FromUri] string videoTitle, [FromUri] string description,
[FromUri] short enterpriseId, [FromUri] int userId, [FromUri] int applicationId)
{
string lFileBase64 = pData["file"]["File64Code"].ToString();
string lFileName = pData["file"]["FileName"].ToString();
Dictionary<string, string> exportParams = new Dictionary<string, string>();
exportParams.Add("TYPE", ((int)RequestType.UsersImport).ToString());
exportParams.Add("PFK_ENTERPRISE", enterpriseId.ToString());
exportParams.Add("PK_USER", userId.ToString());
exportParams.Add("PK_APPLICATION", applicationId.ToString());
exportParams.Add("FILE_NAME", lFileName);
Models.RequestLog requestLog = new Models.RequestLog();
requestLog.Data = RequestLogService.ParseRequestParams(exportParams);
requestLog.Type = RequestType.UsersImport;
int requestId = RequestLogService.CreateRequestLog(enterpriseId, userId,
Mapper.Map<RequestLog>(requestLog));
if (requestId > 0)
{
//update request status
exportParams.Add("PK_REQUEST", requestId.ToString());
requestLog.Id = requestId;
requestLog.Status = RequestStatus.Sent;
requestLog.Data = RequestLogService.ParseRequestParams(exportParams); ;
RequestLogService.UpdateRequestLog(enterpriseId, userId,
Mapper.Map<RequestLog>(requestLog));
string pCloudStorageAccount = AzureHelper.SelectAzureStorageAccount(enterpriseId);
string pContainer = "docstmp" + AzureStorageSettings.AzureStorageContainer;
MemoryStream myStream = new MemoryStream(Convert.FromBase64String(lFileBase64));
Guid guid = Guid.NewGuid();
lFileName = "UploadVideo_" + enterpriseId.ToString() + "_" + guid.ToString() + ".mp4";
string urlAzure = AzureStorageHelpers.UploadFile(pCloudStorageAccount, pContainer, lFileName, myStream);
exportParams.Add("URL", urlAzure);
requestLog.Data = RequestLogService.ParseRequestParams(exportParams);
RequestLogService.QueueRequest(enterpriseId, userId,
Mapper.Map<RequestLog>(requestLog));
}
else
{
return false;
}
return true;
}
但是这个方法在这里不相关,因为我的问题是 Postman 没有到达终点。
在下面的图片中,您可以看到抛出错误的 Postman 请求的详细信息。
有什么帮助吗?
编辑 1: 从 Swagger 获得的额外信息可能会有帮助。
"/api/Catalogues/UploadVideo":{
"post":{
"tags":[
"Catalogues"
],
"operationId":"Catalogues_UploadVideo",
"consumes":[
"application/json",
"text/json",
"application/x-www-form-urlencoded"
],
"produces":[
"application/json",
"text/json"
],
"parameters":[
{
"name":"pData",
"in":"body",
"required":true,
"schema":{
"type":"object"
}
},
{
"name":"videoTitle",
"in":"query",
"required":true,
"type":"string"
},
{
"name":"description",
"in":"query",
"required":true,
"type":"string"
},
{
"name":"enterpriseId",
"in":"query",
"required":true,
"type":"integer",
"format":"int32"
},
{
"name":"userId",
"in":"query",
"required":true,
"type":"integer",
"format":"int32"
},
{
"name":"applicationId",
"in":"query",
"required":true,
"type":"integer",
"format":"int32"
}
],
"responses":{
"200":{
"description":"OK",
"schema":{
"type":"boolean"
}
}
}
}
}
编辑 2: 已在 Postman 中禁用 SSL 证书验证:
在您的邮递员中,您正在使用 form (body)
发送所有数据。您的端点期望除视频外的所有值都通过 URL 作为查询参数发送。
在 postman 中,将所有值添加到 Params
选项卡,然后将视频添加到 Body
选项卡。
你端点上的属性,你已经说明了这一点。 [FromBody]
表示与 POST
一起发送的表单。 [FromUri]
告诉端点它期望一个值包含在 URL 本身中。
这也在您的 swagger 示例中进行了概述:
正文
"name":"pData",
"in":"body" //<--this
查询
"name":"videoTitle",
"in":"query", //<--this
编辑: 我建议遵循 this MS 文档。使用正确的方法上传大文件。