C# 在c中调用时,RESTAPI主体参数被传递为null

C# 在c中调用时,RESTAPI主体参数被传递为null,c#,.net,asp.net-mvc,rest,service,C#,.net,Asp.net Mvc,Rest,Service,我正在尝试从c调用RESTAPI方法。问题是对于所有内容类型,它都会将null传递给body参数。我在下面共享了我的代码。除了这些代码之外,我还尝试将body参数作为流写入请求。它也不起作用。我还尝试将“application/x-www-form-urlencoded”作为内容类型 从c示例调用rest api方法: string token = Server.UrlEncode("v0WE/49uN1/voNwVA1Mb0MiMrMHjFunE2KgH3keKlIqei3b7

我正在尝试从c调用RESTAPI方法。问题是对于所有内容类型,它都会将null传递给body参数。我在下面共享了我的代码。除了这些代码之外,我还尝试将body参数作为流写入请求。它也不起作用。我还尝试将“application/x-www-form-urlencoded”作为内容类型

从c示例调用rest api方法:

        string token = Server.UrlEncode("v0WE/49uN1/voNwVA1Mb0MiMrMHjFunE2KgH3keKlIqei3b77BzTmsk9OIREken1hO9guP3qd4ipCBQeBO4jiQ==");
        string url = "http://localhost:2323/api/Applications/StartProcess?token=" + token;
        string data =  @"{""ProcessParameters"": [{ ""Name"":""flowStarter"",""Value"": ""Waffles"" }],
                         ""Process"": ""RESTAPISUB""}";

        System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
        client.BaseAddress = new System.Uri(url);
        byte[] cred = UTF8Encoding.UTF8.GetBytes("username:password");
        client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(cred));
        client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

        System.Net.Http.HttpContent content = new StringContent(data, UTF8Encoding.UTF8, "application/json");
        HttpResponseMessage messge = client.PostAsync(url, content).Result;
        string description = string.Empty;
        if (messge.IsSuccessStatusCode)
        {
            string result = messge.Content.ReadAsStringAsync().Result;
            description = result;
        }
Rest api方法:

    [HttpPost]
    [ActionName("StartProcess")]
    public int StartProcess([FromUri]string token,[FromBody]WorkflowStartParameters parameters)
    {
        try
        {
            LoginInformation info = CasheProcesses.ReadCashe(token);
            eBAWSAPI api = Service.GetWSService();
            WorkflowProcess proc = api.StartProcess(info.Id, info.Password, info.ImpersonateUserId, info.Language, parameters);

            return proc.ProcessId;
        }
        catch (Exception ex)
        {
            throw new Exception("An error occured when starting process,exception detail:" + ex);
        }
    }
WorkflowStartParameters类结构:

    public class WorkflowStartParameters
    {
        public WorkflowParameter[] ProcessParameters;
        public string Process { get; set; }
    }
    public class WorkflowParameter
    {
        public string Name { get; set; }
        public string Value { get; set; }
    }
我已经搜索了很多这个问题。这似乎是一个非常普遍的问题。我刚刚发现这个解决方案工作正常,将请求参数传递给RESTAPI方法并从中读取主体参数。但这对我来说不是一个有效的解决方案

如果你有任何想法,欢迎分享。

谢谢,
Zehra

我不知道它是否能解决你的问题,但让我试试。 我想您不必在通话中使用Server.UrlEncode,但是:

  Dim myUri As New Uri(Token)

我猜您不能同时对用户名和密码进行编码-尝试将它们作为字符串传递。

您的问题似乎在这里:

public class WorkflowStartParameters
{
   public WorkflowParameter[] ProcessParameters; <---- needs get/set
   public string Process { get; set; }
}
这需要是一个公共属性才能正确序列化。目前,您已将其设置为公共字段。只需添加{get;set;}并尝试一下。我还将研究使用Newtonsoft.Json进行序列化,以确保对象被正确序列化。尝试使用转义字符串将破坏您发送的更多数据

顺便说一句,序列化数组有时会出现问题,我将其更改为:

public List<WorkflowParameter> ProcessParameters{get;set;} 

最后,我实现了将填写的数据发送到服务器。这是关于序列化问题的。但在发送数据之前,它不适用于json序列化。我已经将DataContract属性添加到我的类中,它可以正常工作。

不幸的是,当我从java脚本进行ajax调用时,我仍然无法理解这一点,它在没有DataContract属性的情况下工作,但如果我在c中调用它,它需要DataContract属性。如果有人分享这方面的信息,我将不胜感激

我正在分享新的班级结构,其他的一切都是一样的:

    [Serializable]
    [DataContract]
    public class WorkflowParameter
    {
        [DataMember]
        public string Name { get; set; }
        [DataMember]
        public string Value { get; set; }
    }

    [Serializable]
    [DataContract]
    public class WorkflowStartParameters
    {
        [DataMember]
        public WorkflowParameter[] ProcessParameters { get; set; }
        [DataMember]
        public string Process { get; set; }
    }

您能否更新您的问题并显示此对象的外观:WorkflowStartParameters?我猜您发送的内容无法序列化回该类型。此外,您还应该考虑使用NewtonSoft.json之类的东西将对象解析为json。如果您还没有,那么就有一个nuget pckage。命名重要吗?数据中有WorkflowParameter,WorkflowParameters为param。。如果从数据中去掉WorkflowParameter,只传递fields@StephenBrickner谢谢你的回复,我认为序列化正是问题所在,因为当我以字符串形式发送正文参数时,它工作得很好。但我尝试过发送序列化数据,但对于复杂类型,它传递的仍然是空的。顺便说一下,我已将WorkflowStartParameters类结构添加到我的问题中。@JamieD77是的,这是一个选项,但我们的问题中有太多复杂的正文参数类型RESTAPI服务。我应该用其他方法解决这个问题:|我在下面添加了一个答案。您需要查看ProcessParameters属性。目前,它是一个字段,而不是属性,因此您将无法将json反序列化回您的对象中。