首页 > 解决方案 > 无法发布到构建的 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 没有呢?

谢谢!

杜安

标签: c#api

解决方案


推荐阅读