MVC4 web api在URL中使用XML字符串发布RestRequest

时间:2013-11-15 17:26:36

标签: xml asp.net-mvc-4 asp.net-web-api

我有一个看起来像这样的ApiController:

public class UploadController : ApiController
{
    public StatusModel PostXML(string languageCode, string username, string password, string xml)
    {
        ...
    }
}

我正试图从这样的外部项目中调用此方法:

public StatusModel UploadXML() {
    var client = new RestClient("");
    string url = "http://localhost:52335/api/upload/PostXML/de/" + HttpUtility.UrlEncode(TESTXML) + "/user/password";
    var request = new RestRequest(url, Method.POST);

    return client.Execute<StatusModel>(request).Data;
}

当TESTXML变量是一个像“Test”这样的简单文本时,会调用web api方法并传输值,但是只要我将任何xml标记放入其中,即使它只是一个“&lt;”,尽管我使用了UrlEncoding,它仍然没有了。 不仅我的web api函数没有被调用,Ajax调用我的UploadXML方法跳转到错误函数,尽管获得了http响应200.

经过几个小时的努力寻找解决方案,我没有想法。我究竟做错了什么?如何在URL中传递XML字符串作为参数?

由于

1 个答案:

答案 0 :(得分:1)

这里有很多问题,但通常你应该发布你的数据,而不是使用GET网址来创建帖子:domain.com/controller/action/some/data/here是一个获取请求。 domain.com/controller/action是您的帖子网址,其中的数据采用post url格式的参数。然后,您可以将您的操作绑定到模型,而不是像您所做的那样绑定单个参数。

以下是我在基类中使用的一些代码,用于在从服务器端代码调用API时进行所有API调用:

public string CreateApiRequest(string url, object model, bool isPost)
    {
        try
        {
            ASCIIEncoding encoding = new ASCIIEncoding();
            string postData = "";
            if(model != null)
            {
                postData = Strings.SerializeToQueryString(model).TrimEnd(Convert.ToChar("&"));
            }

            byte[] data = encoding.GetBytes(postData);
            var serviceUrl = "http://" + HttpContext.Request.Url.Host + "/api/{0}";
            // create the post and get back our data stream
            var myRequest = (HttpWebRequest)WebRequest.Create(new Uri(string.Format(serviceUrl, url)));
            if (isPost)
            {
                myRequest.Method = "POST";
                myRequest.ContentType = "application/x-www-form-urlencoded";
                myRequest.Accept = "application/json";

                myRequest.ContentLength = data.Length;
                Stream newStream = myRequest.GetRequestStream();
                // Send the data.
                newStream.Write(data, 0, data.Length);
                newStream.Close();
            }
            else
            {
                myRequest.Method = "GET";
                myRequest.Accept = "application/json";
            }


            // Get response  
            using (HttpWebResponse response = myRequest.GetResponse() as HttpWebResponse)
            {
                // Get the response stream  
                var reader = new StreamReader(response.GetResponseStream());

                // Read the whole contents and return as a string  
                var myString = reader.ReadToEnd();
                return myString;
            }
        }
        catch (Exception ex)
        {
            // handle error here, I have my own custom mailer
            throw;
        }
    }

这就是我所说的。

var model = JsonConvert.DeserializeObject<List<Address>>(CreateApiRequest(url: "Address", model: null, isPost: false));

希望这会有所帮助