如何使用WebClient类将值从一个服务器发布到另一个服务器?

时间:2013-09-29 18:48:51

标签: c# asp.net-web-api

我正在尝试将请求从一台服务器发布到使用WebAPI技术的第二台服务器。 这是接收呼叫的方法

[HttpGet]
    [HttpPost]
    public HttpResponseMessage MyMethod([FromBody] string token, [FromBody] string email, [FromBody] string password)
    {

        string a = "hello world!";
        return new HttpResponseMessage() { Content = new StringContent(a) };
    }

我正在使用此代码发布到它:

using (var c = new WebClient())
        {
            //string obj = ":" + JsonConvert.SerializeObject(new { token= "token", email="email", password="password" });
            NameValueCollection myNameValueCollection = new NameValueCollection();

            // Add necessary parameter/value pairs to the name/value container.
            myNameValueCollection.Add("token", "token");
            myNameValueCollection.Add("email", "email");

            myNameValueCollection.Add("password", "password");

            byte[] responseArray = c.UploadValues("MyServer/MyMethod", "POST", myNameValueCollection);


            return Encoding.ASCII.GetString(responseArray);
        }

我尝试了几种替代方案。

我上面写的这个给了我一个内部服务器错误,我的MyMethod中的断点没有被命中,所以问题不在我方法的代码上。

在评论为nameValueCollection添加参数的三行时,我得到了404。

从MyMethod的签名中删除参数,它可以正常工作。

我想将此信息发布到托管API的服务器。

你知道我做错了吗?

1 个答案:

答案 0 :(得分:1)

一如既往地编写视图模型:

public class MyViewModel 
{
    public string Token { get; set; }
    public string Email { get; set; }
    public string Password { get; set; }
}

您的控制器操作将作为参数:

[HttpPost]
public HttpResponseMessage MyMethod(MyViewModel model)
{

    string a = "hello world!";
    return new HttpResponseMessage() { Content = new StringContent(a) };
}

请注意,我已经摆脱了[HttpGet]属性。你必须选择动词。顺便说一句,如果您遵循标准的ASP.NET Web API路由约定,您的操作名称应该与用于访问它的HTTP谓词相对应。这是标准的RESTful约定。

现在你可以点击它:

using (var c = new WebClient())
{
    var myNameValueCollection = new NameValueCollection();

        // Add necessary parameter/value pairs to the name/value container.
    myNameValueCollection.Add("token", "token");
    myNameValueCollection.Add("email", "email");
    myNameValueCollection.Add("password", "password");

    byte[] responseArray = c.UploadValues("MyServer/MyMethod", "POST", myNameValueCollection);

    return Encoding.ASCII.GetString(responseArray);
}