我正在try 将一个字符串从客户端传输到ASP.NET MVC4应用程序.

但是我无法接收字符串,它可能是空的,或者找不到POST方法(404错误)

用于传输字符串的客户端代码(控制台应用程序):

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:49032/api/test");
request.Credentials = new NetworkCredential("user", "pw");
request.Method = "POST";
string postData = "Short test...";
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = byteArray.Length;

Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();

WebResponse response = request.GetResponse();
Console.WriteLine(((HttpWebResponse)response).StatusDescription);
dataStream = response.GetResponseStream();

StreamReader reader = new StreamReader(dataStream);
string responseFromServer = reader.ReadToEnd();
Console.WriteLine(responseFromServer);
reader.Close();
dataStream.Close();
response.Close();
Console.ReadLine();

ASP.NET Web Api控制器:

public class TestController : ApiController
{
    [Authorize]
    public String Post(byte[] value)
    {
        return value.Length.ToString();
    }
}

在这种情况下,我可以调用"Post"方法,但"value"是NULL. 如果我将方法签名更改为(字符串值),那么它将永远不会被调用.

Even "without" the [Authorize] setting it has the same strange behavior. -> So it has nothing to do with the user authentication.

知道我做错了什么吗?

推荐答案

您似乎在Web API控制器操作中使用了大约[Authorize]个属性,我不认为这与您的问题有什么关系.

那么,让我们开始实践吧.下面是一个简单的Web API控制器的外观:

public class TestController : ApiController
{
    public string Post([FromBody] string value)
    {
        return value;
    }
}

对于这一点,消费者:

class Program
{
    static void Main()
    {
        using (var client = new WebClient())
        {
            client.Headers[HttpRequestHeader.ContentType] = "application/x-www-form-urlencoded";
            var data = "=Short test...";
            var result = client.UploadString("http://localhost:52996/api/test", "POST", data);
            Console.WriteLine(result);
        }
    }
}

毫无疑问,您会注意到Web API控制器属性的[FromBody]装饰,以及来自客户端的POST数据的=前缀.我建议你阅读how does the Web API does parameter binding,以便更好地理解这些概念.

[Authorize]属性而言,这可以用来保护您的服务器上的某些操作不被只有经过身份验证的用户访问.事实上,你想要达到的目的并不清楚,顺便说一句,你应该在你的问题中更清楚地说明这一点.您是在试图了解参数绑定在ASP.NET Web API中的工作原理(如果这是您的目标,请阅读我链接的文章),还是在try 进行一些身份验证和/或授权?如果第二个是您的 case ,您可能会发现我在这个主题上写的following post个 case 很有趣,可以帮助您开始.

如果在阅读了我链接到的资料之后,你和我一样,对自己说,WTF人,我需要做的就是向服务器端端点发布一个字符串,我需要做所有这些?不可能.然后 checkout ServiceStack.您将有一个与Web API进行比较的良好基础.我不知道微软的伙计们在设计Web API时在想什么,但说真的,我们应该为HTML(想想Razor)和REST之类的东西设置单独的基本控制器吗?这不可能是严重的.

Asp.net相关问答推荐

RNGCryptoServiceProvider - 随机数审核

如何获取已构建、编码的 ViewState 的值?

取消选中时 ASP.NET CheckBox 不会触发 CheckedChanged 事件

是否可以访问位于另一个项目中的 MVC 视图?

有没有办法将 onclick 事件添加到 ASP.NET 标签服务器控件?

无法访问,内部,资源文件?

SameSite 属性如何自动添加到我的 Asp.net_SessionID cookie 中?

如何在没有实体框架的情况下使用 ASP.NET Identity 3.0

asp.net mvc 中的 RedirectToAction 用法

什么时候不应该使用 Web 服务?

如何在同一解决方案中从 MVC 项目调试 Web API 项目

在生产中使用 LocalDb 是否正常?

C# 7 本地函数未按预期工作且未显示错误

ASP.NET Core 中的 NuGet 包位置在哪里?

*.csproj 中的 usevshostingprocess 是什么?

应该如何使用 RedirectToRoute?

回发不适用于 aspx 页面作为默认文档

HtmlAgilityPack Select 的子 node 不符合预期

ASP.NET 网格视图与列表视图

如何在不遍历每个循环的情况下从字典对象中获取所有键(仅键)