c# - 无法发布到构建的 API - 获取空值
问题描述
我写了一个可由 Postman 调用的 API,没问题。但是,当我尝试从另一个 C# 项目中调用我的 API 时,API 接收到 NULL 数据。这是我的 API 控制器(邮递员调用它,没问题):
public class BuildVirtualMachineController : ApiController
{
public HttpResponseMessage Post(VirtualMachine virtualMachine)
{
System.ComponentModel.DataAnnotations.ValidationContext vc = new ValidationContext(virtualMachine);
ICollection<ValidationResult> results = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(virtualMachine, vc, results, true);
if(!isValid)
{
return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ModelState);
}
string theReturn = JenkinsREST.BuildVirtualMachine(virtualMachine);
return Request.CreateResponse(HttpStatusCode.OK, theReturn);
}
您可以看到它期望 JSON 可以转换为 VirtualMachine 对象。这是 Postman 发送给它的内容:
{
"Hostname": "pocdua133",
"IPAddress": "172.30.32.133",
"ResourceGroup": "hud-edw-poc-rg",
"StorageAccount": "sapocimages",
"BaseImage": "Windows 2016"
}
这没有问题。现在这是我的应用程序中调用我的 API 的代码,这是当我得到一个空值时,即使数据是相同的:
protected void BuildBtn_BuildVirtualMachine(Object sender, EventArgs e)
{
using (var wb = new WebClient())
{
string url = "http://localhost:54587/api/v1/BuildVirtualMachine";
string queryString = @"{ ""Hostname:""" + Hostname.Text + @""",IPAddress:""" + IPAddress.Text + @""",ResourceGroup:""" + ResourceGroups.SelectedItem.Text + @""",StorageAccount:""" + StorageAccount.Text + @""",BaseImage:""" + BaseImage.Text + @"""}";
string password = "73c986bcaae14a6a93d345c270f3e1ba";
string username = "admin";
string basicAuthToken = Convert.ToBase64String(Encoding.Default.GetBytes(username + ":" + password));
wb.Headers["Authorization"] = "Basic " + basicAuthToken;
wb.Headers[HttpRequestHeader.ContentType] = "application/json";
wb.Headers.Add("user", "admin:73c986bcaae14a6a93d345c270f3e1ba");
string response = wb.UploadString(url, queryString);
WebHeaderCollection results = wb.ResponseHeaders;
//return results.ToString();
}
}
如果有帮助,这是我的 API 中定义的虚拟机模型:
public class VirtualMachine
{
[Required(ErrorMessage = "Hostname is required.")]
public string Hostname { get; set; }
[Required(ErrorMessage = "IP address is either not given or in improper format")]
[RegularExpression(@"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])){3}$")]
public string IPAddress { get; set; }
[Required(ErrorMessage = "Resource group is required.")]
public string ResourceGroup { get; set; }
[Required(ErrorMessage = "Storage account is required.")]
public string StorageAccount { get; set; }
[Required]
public string BaseImage { get; set; }
[System.ComponentModel.DefaultValue("Standard_DS2_v2")]
public string VMSize { get; set; }
[System.ComponentModel.DefaultValue("apps")]
string VHDContainer { get; set; }
}
我已经使用类似的代码来调用其他 API,我的 JSON 看起来和 Postman 中的一样,那么为什么 POST 总是给我的 API 一个空值而 Postman 没有呢?
谢谢!
杜安
解决方案
推荐阅读
- django-models - 如何修复无法通过 Words 实例错误访问管理器?
- node.js - SIGTERM 事件后:进程不断接收请求
- javascript - 从外部函数获取数据在 React 中不起作用
- c++ - 在 C++ 中运行时评估参数表达式?
- google-apps-script - 这些天 getPublicCache() 是什么?
- javascript - ExecuteMany 在 NUMBER 列中插入错误值:值太大而不是实际值
- javascript - 样式化组件 - 防止重复的最佳实践
- swift - 从 SceneDelegate 实例化时如何获取完整的 viewController
- anylogic - AnyLogic 延迟组件中的速率不变
- reactjs - 在某些页面上缺少反应 mui appbar