Tag: asp.net web api

为什么我的文件没有被我的Web API函数的GET请求返回?

我有一个函数可以通过我的REST API访问,配置ASP.NET Web API 2.1,应该将图像返回给调用者。 出于测试目的,我只是让它返回我现在存储在本地计算机上的示例图像。 这是方法: public IHttpActionResult GetImage() { FileStream fileStream = new FileStream(“C:/img/hello.jpg”, FileMode.Open); HttpContent content = new StreamContent(fileStream); content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(“image/jpeg”); content.Headers.ContentLength = fileStream.Length; return Ok(content); } 调用此方法时,我根本无法获取图像。 以下是我收到的回复: { “接头”:[{ “密钥”: “内容类型”, “值”:[ “图像/ JPEG”]},{ “密钥”: “内容长度”, “值”:[ “30399”] }]} 为什么我没有将图像数据作为请求的一部分返回? 怎么解决这个问题?

基于令牌的webapi实现以保护端点

我有一个带有Web服务的Web应用程序,客户端将使用我的Web应用程序注册他们的应用程序。 现在,客户端将拥有SPA或移动应用程序的应用程序 ,他们将从他们的应用程序中使用我的Web服务。 所以我将实现基于令牌的机制来保护对我的端点的访问。 1)但是在这里我很困惑,我应该使用任何框架来生成访问令牌,或者我可以使用任何库,它将生成任何随机字符串,我将在响应中发送。例如这样的事情: TokenId = Convert.ToBase64String(Guid.NewGuid().ToByteArray()).Replace(“+”, “_”) 因此,在注册应用程序时,如果客户端已为其应用程序启用了身份validation,则将validation用户,然后我将返回访问令牌,并使用该用户ID保存在数据库中的accesstoken。 所以我的数据库表如下所示,用于存储经过validation的accesstoken: Id(autogenerated) accesstoken userid clientid createdat expiresat 因此,在用户进行身份validation后,现在如果用户想要访问任何受保护资源,则用户需要在后续调用头中传递此访问令牌。 所以我要做的是,我将从头部获取访问令牌,然后validation对该数据库的accessstoken,然后允许访问我的受保护资源,其他明智的用户将获得授权。 我已经看到很多与此相关的事情,所以基本上这是oauth2,我想实现这个。 我见过Openid connect (这个项目甚至不编译),它位于oauth2之上,用于身份validation,oauth2将用于授权。 但在这里,因为我在我的数据库中存储访问令牌,所以这是我的疑问: 2)现在我需要openconnectid(但是这个项目甚至没有编译)来validation访问令牌,或者因为我在我的数据库中存储访问令牌,我不需要openconnectid? 3)我想实现asp.net身份,但后来我将收到动态数据库连接字符串,因为我看到asp.net身份主要与entity framework一起工作我找不到任何我可以使用ado.net来validation用户名的来源和密码使用SQL查询。 我知道我可以这样做: 创建一个实现IUser的自定义用户类,如此处所述定义实现的自定义用户存储 public class UserStoreService : IUserStore, IUserPasswordStore 但我没有这个信息,因为我没有固定连接string.connection字符串再次存储在客户端注册的数据库中。 4)我们已经为用户提供了一个固定的端点,客户端可以通过该端点创建管理员,因此我将使用我的RSA算法进行密码散列,然后将其存储在数据库中。 那么现在我需要使用asp.net身份吗? 5)我已经看到很多以下链接与基于令牌的实现,但我没有得到他们在哪个部分validationaccesstoken但现在因为我有存储在我的数据库中的accesstoken我是否需要使用以下任何实现? JSON Web Token in ASP.NET Web API 2 using Owin Token Based Authentication using ASP.NET Web […]

使用C#.net在winform中调用和使用Web API

我是初学者并创建winform应用程序。 其中我必须使用API​​进行简单的CRUD操作。 我的客户与我共享了API,并要求以JSON的forms发送数据。 API: http : //blabla.com/blabla/api/login-valida KEY:“HelloWorld” 价值:{“email”:“user@gmail.com”,“密码”:“123456”,“时间”:“2015-09-22 10:15:20”} 响应:Login_id 如何将数据转换为JSON,使用POST方法调用API并获得响应? 编辑 stackoverflow上的某个地方我找到了这个解决方案 public static void POST(string url, string jsonContent) { url=”blabla.com/api/blala” + url; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(baseURL); request.Method = “POST”; System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding(); Byte[] byteArray = encoding.GetBytes(jsonContent); request.ContentLength = byteArray.Length; request.ContentType = @”application/json”; using (Stream dataStream = request.GetRequestStream()) { dataStream.Write(byteArray, 0, […]

在返回客户端之前修改JSON的通用方法

我正在使用一个通用方法,它允许我修改返回给客户端的对象的JSON,特别是删除返回对象中的某些属性。 与此处的建议相似。 这些修改是非确定性的,因为它们是根据与用户相关的规则按请求确定的。 所以这不适合缓存的方法。 我已经回顾了几种方法。 最明显的选择是JsonConverter,但是这里存在问题,如此处和此处所列。 这种方法的主要问题是调用JToken.FromObject中的WriteJson来获取特定值的JSON,递归调用相同的JsonConverter,从而产生循环。 我已经尝试了此处列出的解决方案的变体,它提供了一种暂时禁用CanWrite以防止循环问题的方法。 但是,它似乎不适用于多个并发请求。 JsonConverter的单个实例在多个线程之间共享,这些线程在不同时间更改和读取CanWrite属性的状态,从而导致不一致的结果。 我也尝试在WriteJson使用不同的序列化WriteJson (即除了提供给该方法的序列化WriteJson之外)但是这不支持递归(因为该序列化程序不使用我的JsonConverter)所以任何嵌套项目都不会由我处理JsonConverter。 从默认的序列化程序的转换器集合中删除我的JsonConverter也存在同样的问题。 基本上,如果我想能够递归处理我的模型对象,我将得到自引用循环问题。 理想情况下, JToken.FromObject有一些方法可以选择性地不在对象本身上调用JsonConverter,但仍然在序列化期间将它应用于任何子对象。 只有在传递给CanConvert的对象与传递给CanConvert的最后一个对象的类型不同时,我才通过修改CanConvert将CanWrite设置为true来解决这个WriteJson 。 但是为了实现这一点,我需要一个每请求范围的JsonConverter(由于上面相同的线程原因),但我看不出如何得到它。 以下是我的样本: – using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Newtonsoft.Json.Serialization; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Test { public class TestConverter : JsonConverter { bool CannotWrite { get; set; } public override bool […]

如何使用.net 4 api端点从Request.Content对象获取原始请求正文

我正在尝试捕获原始请求数据以进行问责,并希望将请求正文内容从Request对象中提取出来。 我看过做Request.InputStream的建议,但这个方法在Request对象上不可用。 知道如何获取Request.Content体的字符串表示吗?

添加新的OData控制器会使现有控制器失败

我正在从两个Web API OData示例构建一个示例,每个示例都可以作为一个单独的项目正常工作。 但是当我添加第二个ODataController类时,该站点不再适用于以前工作的OData路径模板。 这里有更多细节: 只要其控制器(ProductsController)是唯一的控制器,以下操作就可以正常工作: [HttpGet] [ODataRoute(“GetSalesTaxRate(state={state})”)] public IHttpActionResult GetSalesTaxRate([FromODataUri] string state) { return Ok(GetRate(state)); } 现在我添加了一个带有一些动作的新控制器(MoviesController)。 我扩展了Owin Startup类,所以它看起来像这样: public void Configuration(IAppBuilder builder) { var config = new HttpConfiguration(); config.MapODataServiceRoute(routeName: “functions route”, routePrefix: “functions”, model: FunctionStartup.GetEdmModel()); config.MapODataServiceRoute(routeName: “actions route”, routePrefix: “actions”, model: ActionStartup.GetEdmModel()); builder.UseWebApi(config); } 但是,当我尝试执行Web请求(URLBASE / functions / $ metadata)时,出现以下错误: System.InvalidOperationException控制器“Products”中的操作“GetSalesTaxRate”上的路径模板“GetSalesTaxRate(state = {state})”不是有效的OData路径模板。 […]

使用WebApi,ajax上传文件

我想通过进行ajax调用使用WebApi上传文件,文件将保存到数据库中。 我尝试了这个链接中给出的代码。 在这里,它将收到的数据保存为硬盘驱动器作为没有指定扩展名的文件,但我想做一些事情,比如当我将文件保存到数据库时我也希望保存文件名和扩展名,如果我需要的话下载文件我可以提供文件名和扩展名。 在链接中,文件作为文件保存到硬盘驱动器,但有任何方法可以直接将文件保存到DB。

将包含复杂类型数组的复杂类型传递给Web API

从这个问题延伸,我试图将包含复杂对象集合的复杂对象传递给ASP.NET Web API控制器操作方法,但是我在查找用于输入对象的正确格式时遇到了问题。请求。 继续从克里斯托弗约翰逊的问题(并删除一些字段为简单)的例子,如果我改变他的PhoneRequest对象包含一组电话号码… public class PhoneRequest { public string[] PhoneNumbers { get; set; } public string State { get; set; } } …我将参数作为URL编码的查询字符串传递: /api/phonenumber?id[0][State]=UT&id[0][PhoneNumbers][0]=555-1234567 …或将其作为html表单编码( Content-Type: application/x-www-form-urlencoded )请求正文: [0][State]=UT&[0][PhoneNumbers][0]=555-1234567 ……然后一切都很好。 但是如果我将PhoneNumbers从一组字符串更改为一个新的PhoneNumber类型的集合…… public class PhoneRequest { public PhoneNumber[] PhoneNumbers { get; set; } public string State { get; set; } } public class PhoneNumber { […]

测试使用HttpContext.Current.Request.Files的Web API方法?

我正在尝试编写一个使用HttpContext.Current.Request.Files的Web API方法的测试,经过详尽的搜索和实验后,我无法弄清楚如何模拟它。 正在测试的方法如下所示: [HttpPost] public HttpResponseMessage Post() { var requestFiles = HttpContext.Current.Request.Files; var file = requestFiles.Get(0); //do some other stuff… } 我意识到还有其他 类似的 问题 ,但它们没有解决这个具体情况。 如果我试图模拟上下文,我会遇到Http*对象层次结构的问题。 假设我设置了各种模拟对象(使用Moq ),如下所示: var mockFiles = new Mock(); mockFiles.Setup(s => s.Count).Returns(1); var mockFile = new Mock(); mockFile.Setup(s => s.InputStream).Returns(new MemoryStream()); mockFiles.Setup(s => s.Get(It.IsAny())).Returns(mockFile.Object); var mockRequest = new Mock(); mockRequest.Setup(s => […]

从Javascript将KeyValuePair或IDictionary的列表传递给Web Api控制器

我有一个web api控制器,我想发布两个参数。 一个是扁平的int ID,另一个是IDictionary或类似的等价物。 [HttpPost] public void DoStuff(int id, [FromBody]IDictionary things) { } var things = new Array(); things.push({ 1: 10 }); // tried things.push({ Key: 1, Value: 10 }) things.push({ 2: 11 }); $.ajax({ url: ‘/api/DoStuff?id=’ + id, data: ‘=’ + JSON.stringify(things), // tried what seems like 100 different things here type: ‘POST’, dataType: […]