Tag: asp.net web api

发送XML时,AspNet WebApi POST参数为null

我有一个最初使用beta位的web api服务,我已经使用候选版本位进行了重建,现在我遇到了这个问题。 我有一个POST操作,它将复杂选项作为唯一参数。 当我以json格式发送请求时,对象按预期反序列化,但如果我发送XML而不是参数为null。 在测试版中,我通过禁用模型绑定来解决这个问题,如Carlos Figueira的博客文章中描述的禁用ASP.NET Web API Beta上的模型绑定 但是在RC中,他们已经删除了此方法正在实现的IRequestContentReadPolicy。 我的行动: public List Post([FromBody]Models.AimiRequest requestValues) { try { if (requestValues == null) { var errorResponse = new HttpResponseMessage(); errorResponse.StatusCode = HttpStatusCode.NotFound; errorResponse.Content = new StringContent(“parameter ‘request’ is null”); throw new HttpResponseException(errorResponse); } var metadataParams = new List<KeyValuePair>(); foreach (Models.MetadataQueryParameter param in requestValues.Metadata) { metadataParams.Add(new KeyValuePair(param.Name, […]

使用MultipartFormDataStreamProvider和ReadAsMultipartAsync

我如何在ApiController使用MultipartFormDataStreamProvider和Request.Content.ReadAsMultipartAsync ? 我用谷歌搜索了一些教程,但是我无法使用任何一个教程,即使用.net 4.5。 这就是我目前得到的: public class TestController : ApiController { const string StoragePath = @”T:\WebApiTest”; public async void Post() { if (Request.Content.IsMimeMultipartContent()) { var streamProvider = new MultipartFormDataStreamProvider(Path.Combine(StoragePath, “Upload”)); await Request.Content.ReadAsMultipartAsync(streamProvider); foreach (MultipartFileData fileData in streamProvider.FileData) { if (string.IsNullOrEmpty(fileData.Headers.ContentDisposition.FileName)) { throw new HttpResponseException(Request.CreateResponse(HttpStatusCode.NotAcceptable, “This request is not properly formatted”)); } string fileName = fileData.Headers.ContentDisposition.FileName; […]

unit testing中的模型状态validation

我正在为这样的控制器编写unit testing: public HttpResponseMessage PostLogin(LoginModel model) { if (!ModelState.IsValid) return new HttpResponseMessage(HttpStatusCode.BadRequest); } 该模型看起来像: public class LoginModel { [Required] public string Username { set; get; } [Required] public string Password { set; get; } } 然后我有像这样的unit testing: [TestMethod] public void TestLogin_InvalidModel() { AccountController controller = CreateAccountController(); … var response = controller.PostLogin(new LoginModel() { }); Assert.AreEqual(HttpStatusCode.BadRequest, […]

WebApi POST没有吗?

我有这个控制器动作: [HttpPost] [ActionName(“aaa”)] public HttpResponseMessage aaa(Z z) //notice – no [FromBody] { return Request.CreateResponse(HttpStatusCode.OK, 1); } Z是: public class Z { public string a { get; set; } } 但是当我通过提琴手发帖时: POST http://localhost:11485/api/profiles/aaa HTTP/1.1 Content-Type: application/x-www-form-urlencoded; charset=UTF-8 Host: localhost:11485 Content-Length: 3 Accept-Encoding: gzip, deflate Accept-Language: en-US,en;q=0.8,he;q=0.6 Cache-Control: no-cache Connection: keep-alive a=1 我实际上可以看到它正在工作: 题: 如果是这样,没有[FromBody]属性它如何工作? 我还需要/不写这个属性吗? 此外,不写这个属性的情况是什么 […]

ASP.NET 5中的Web API身份validation

我一直在研究ASP.NET 5已经有一段时间了,还有一些我很困惑的事情。 要在Web API 2中实现身份validation,我过去基本上使用的是OWIN OAuth身份validation服务器中间件。 它使用起来很简单,我可以配置我需要的东西,而且我不需要在应用程序上放置一堆东西而不需要它。 现在,起初我没有在ASP.NET 5中找到它,我认为等待中间件出现是一个时间问题。 但昨天,在阅读有关安全回购的问题时,我发现显然无意将此中间件移植到新版本的框架中。 相反,似乎鼓励人们使用Identity Server 3.我看了一下项目,虽然它很好并且有很多用法我真的更喜欢配置我有时需要的最小值。 另外,另一个缺点是Identity Server 3需要完整的CLR,所以如果我需要使用它来为我的应用程序提供身份validation,我需要停止使用Core CLR,这对我来说是一个巨大的劣势,因为Core CLR是一个更轻巧。 因此,如果我不想在ASP.NET 5上使用Identity Server 3,如果OAuth Authentication Server中间件消失,如何为Web API实现身份validation? 有没有人通过这个并找到了处理它的方法? 如何在不使用Identity Server 3的情况下处理ASP.NET 5 Web API上的身份validation?

为什么我们不能像在WCF或ASMX中那样在Visual Studio中添加Web API作为“服务引用”?

我决定将Web API(作为中间层)用于我正在开发的应用程序,但似乎无法弄清楚如何将其“绑定”到前端(前端是ASP.NET MVC4项目)。 通常,我只需右键单击前端的服务,选择“添加服务引用”,然后将我的服务的URL放入。但是使用Web API,我不能这样做。 从我的前端使用的Web API创建客户端代理类有哪些选择,为什么不像添加WCF或ASMX那样将Web API支持作为引用添加?

如何将默认Web API 2更改为JSON格式化程序?

我有一个Web API项目,它返回一些产品数据。 它根据请求的Accept标头(JSON / XML)正确协商返回类型。 问题是,如果没有指定Accept标头,则返回XML,但我希望它默认返回JSON http://website.com/MyPage?type=json // returns json http://website.com/MyPage?type=xml // returns xml http://website.com/MyPage // returns xml by default 这是我目前的代码如下: GlobalConfiguration.Configuration.Formatters.XmlFormatter.MediaTypeMappings.Add( new QueryStringMapping(“type”, “xml”, new MediaTypeHeaderValue(“application/xml”))); GlobalConfiguration.Configuration.Formatters.JsonFormatter.MediaTypeMappings.Add( new QueryStringMapping(“type”, “json”, new MediaTypeHeaderValue(“application/json”)));

使用HttpClient和Web API方法参数发布到Web API最终为空

我正在尝试使用HttpClient POST到Web API。 当我在Web API的Save方法中放置断点时,[FromBody] Product为null。 这意味着我将产品发布到Web API的方式出了问题。 有人可以看看下面的代码,看看我可能会出错。 我假设它与标题和内容类型有关。 POST从客户端存储库调用Web API,它应该通过JSON传递产品对象: public async Task SaveProduct(Product product) { using (var client = new HttpClient()) { client.BaseAddress = new Uri(“http://localhost:99999/”); client.DefaultRequestHeaders.Accept.Clear(); client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue(“application/json”)); StringContent content = new StringContent(JsonConvert.SerializeObject(product)); // HTTP POST HttpResponseMessage response = await client.PostAsync(“api/products/save”, content); if (response.IsSuccessStatusCode) { string data = await response.Content.ReadAsStringAsync(); product […]

HttpClient和Windows Auth:将用户的消费者登录到服务

我正在努力理解并建立一个服务和消费者,服务将在用户登录消费者时运行。 我的消费者是一个MVC应用程序。 我的服务是一个Web Api应用程序。 两者都在同一域内的不同服务器上运行。 两者都设置为使用Windows身份validation。 我的消费者代码是: private T GenericGet(string p) { T result = default(T); HttpClientHandler handler = new HttpClientHandler() { PreAuthenticate = true, UseDefaultCredentials = true }; using (HttpClient client = new HttpClient(handler)) { client.BaseAddress = new Uri(serviceEndPoint); HttpResponseMessage response = client.GetAsync(p).Result; if (response.IsSuccessStatusCode) result = response.Content.ReadAsAsync().Result; } return result; } 在我的服务中,我调用User.Identity.Name来获取调用者ID,但这总是作为消费者应用程序池ID返回,而不是登录用户。 消费者应用程序池作为网络服务运行,服务器本身受信任以进行委派。 […]

转换Web API以使用自托管

我正在尝试将现有的ASP.NET Web API项目(当前在IIS中托管)转换为可以使用SelfHost框架的项目。 我对实际细节有点模糊,但我知道我可以在控制台窗口中运行自主服务器,然后在它上面运行服务。 我遇到的问题是我的项目是MVC项目而不是控制台项目。 我对控制台/ Windows应用程序的熟悉程度有限,因为我通常使用要在IIS中托管的项目。 我有点困惑的是我是否需要将我在Visual Studio中的现有Web API项目转换为新的控制台应用程序,或者是否有办法在解决方案中创建另一个控制台应用程序项目,该项目可以充当Web服务器Web API服务,或者更确切地说,如果有一种方法可以将一个带有Main()入口点的控制台元素添加到现有的MVC项目中(覆盖Global.asax入口点)。 搜索没有产生太多信息,可以帮助我填补这一知识空白。 希望有人能指出我正确的方向。 即使在很高的水平。