在c#

时间:2015-09-04 14:42:43

标签: c# .net asp.net-mvc rest service

我试图从c#调用rest api方法。问题是它传递给body参数的所有内容类型。我在下面共享了我的代码。除了这段代码,我试图将body参数写成请求为stream.It也不起作用。我也尝试过'application / x-www-form-urlencoded'作为内容类型。

从c#sample调用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; }
    }

我经常搜索这个问题。这似乎是一个非常普遍的问题。我刚刚发现这个解决方案正常工作,将请求参数传递给rest api方法并从那里读取body参数。但对我来说这不是一个有效的解决方案。

如果您有任何想法,请随时分享。

谢谢, Zehra

3 个答案:

答案 0 :(得分:0)

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

  Dim myUri As New Uri(Token)

我猜你也不能编码你的用户名和密码 - 尝试将它们作为字符串传递。

答案 1 :(得分:0)

您的问题似乎在这里:

public class WorkflowStartParameters
{
   public WorkflowParameter[] ProcessParameters; <---- needs get/set
   public string Process { get; set; }
}

这需要是一个正确序列化的公共属性。目前,您已将其设置为公共字段。只需添加{get;组;并尝试一下。我还将研究使用Newtonsoft.Json进行序列化以确保您的对象正确序列化。尝试使用转义字符串将会弄乱您发送的数据。

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

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

答案 2 :(得分:0)

最后,我已经实现了向服务器发送填写的数据。这是关于序列化问题。但是在发送数据之前它不适用于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; }
    }