在这里度过一段时间......(Web API 2.1,.NET 4.5.1)
我有一个完美的控制器:
[RoutePrefix("v1/members")]
public class MembersController : ApiController
{
[Route("{id}")]
public Member Get(string id)
{
DataGateway g = new DataGateway();
return g.GetMember(id);
}
}
Run Code Online (Sandbox Code Playgroud)
按预期和期望工作如下:
/v1/members/12345
但是我今天添加了一个新的控制器,它似乎根本没有注册或识别.它不会被添加到帮助页面,并在尝试访问时返回404 Not Found:
[RoutePrefix("v1/test")]
public class Test : ApiController
{
[Route("{id}")]
public string Get(int id)
{
return "value";
}
}
Run Code Online (Sandbox Code Playgroud)
就像我说的那样,新的控制器没有显示在帮助页面中并返回404:
/v1/test/12345

我究竟做错了什么?
编辑添加:
我安装了跟踪,它似乎没有达到那个目的.第一个控制器正常工作并显示跟踪,新的测试控制器不显示任何跟踪信息.
编辑2:
更新了示例代码以更好地匹配我的实际代码,这一直是问题所在.
我可以毫无问题地从Windows应用程序访问我的Web API服务器.但是,从Android来看,却是另一回事
那为什么会这样?
"localhost"使用错误的东西(在URL中)?我应该使用计算机的名称吗?
字符串(字面意思为" http://localhost:28642/api/Departments/GetCount?serialNum=4242")是否需要逐字逐句?
调用REST方法的Windows应用程序和调用相同REST方法的Android应用程序之间的区别是什么会导致后者失败(连接被拒绝)?
android url-routing asp.net-mvc-routing asp.net-web-api econnrefused
我有Web API方法调用另一个标记为async的方法来更新数据库(使用EF 6).我不需要等待db方法来完成(它的火和忘记),因此我await在调用这个异步方法时不会使用它.如果我不调用await,则抛出NullReferenceException,它永远不会传递给我的代码,只是在VS2013的输出窗口中显示为第一次机会异常.
没有await-ing 处理异步方法的正确方法是什么?
以下是我正在做的事情的一个例子:
数据回购方法:
public async Task UpdateSessionCheckAsync(int sessionId, DateTime time)
{
using (MyEntities context = new MyEntities())
{
var session = await context.Sessions.FindAsync(sessionId);
if (session != null)
session.LastCheck = time;
await context.SaveChangesAsync();
}
}
Run Code Online (Sandbox Code Playgroud)
Web api存储库方法:
public async Task<ISession> GetSessionInfoAsync(int accountId, int siteId, int visitorId, int sessionId)
{
//some type of validation
var session =await GetValidSession(accountId, siteId, visitorId, sessionId);
DataAdapter.UpdateSessionCheckAsync(sessionId, DateTime.UtcNow); // this is the line causing the exception if …Run Code Online (Sandbox Code Playgroud) 我使用该解决方案菲利普W¯¯从这里.对于单个文件,它可以正常工作.但对于多个文件我得到错误:NetworkError: 500 Internal Server Error.
Response
Cache-Control no-cache
Content-Length 0
Date Tue, 08 Apr 2014 15:23:07 GMT
Expires -1
Pragma no-cache
Server Microsoft-IIS/8.0
X-AspNet-Version 4.0.30319
X-Powered-By ASP.NET
X-SourceFiles =?UTF-8?B?YzpcdXNlcnNcYW5kcmV5LnNoZWRrb1xkb2N1bWVudHNcdmlzdWFsIHN0dWRpbyAyMDEzXFByb2plY3RzXFBSRVBQXFBSRVBQXGFwaVx1cGxvYWQ=?=
Request
Accept text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Encoding gzip, deflate
Accept-Language en-us,en;q=0.5
Connection keep-alive
Cookie __AntiXsrfToken=b7dbaa70f0cd4c35a8a3a22d75faae03
Host localhost:4955
Referer http://localhost:4955/test.html
User-Agent Mozilla/5.0 (Windows NT 6.1; WOW64; rv:11.0) Gecko/20100101 Firefox/11.0
Run Code Online (Sandbox Code Playgroud)
简单的html:
<body>
<form action="/api/upload" method="post" enctype="multipart/form-data">
<label for="somefile">File</label>
<input name="somefile" type="file" multiple />
<input type="submit" value="Submit" />
</form>
</body>
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
当用户忘记密码时,您不应通过电子邮件发送密码.在他的Pluralsight课程" Hack Yourself First:How to on the Cyber-Offense "中,Troy Hunt声称"SMTP上没有隐含的传输层安全性".信息安全堆栈交换的这个答案证实,以明文(包括通过电子邮件)发送或存储密码是一个坏主意.
似乎重置密码的正确方法是不立即重置密码.相反,通过电子邮件向用户发送限时激活链接.这需要用户的人工干预,并且在任何阶段都不通过电子邮件传递密码.
上述信息安全性答案描述了如何实现密码重置机制:
不要重置用户的密码,不管是什么- "复位"密码是用户记住,这意味着他/她必须要么改变它或将它写下来更难-说,在明亮的黄色便利贴的边缘了监控.相反,只需让用户立即选择一个新的 - 这也是他们想要做的事情.
如果用户忘记了密码,请使用存储在数据库中的随机生成的重置令牌向他们发送安全的一次性重置链接.令牌必须是唯一且保密的,因此在数据库中对令牌进行散列并在使用链接时对其进行比较.
基于表单的网站身份验证的权威指南同样描述了实现:
始终在数据库中散列丢失的密码代码/令牌.再次,此代码是密码等效的另一个示例,因此必须进行哈希处理,以防攻击者抓住您的数据库.当请求丢失密码代码时,将明文代码发送到用户的电子邮件地址,然后哈希,将哈希值保存在数据库中 - 然后丢弃原始密码.就像密码或持久登录令牌一样.
但是用户将如何真正知道新密码.是否重置为默认值?它是否更改为随机生成的密码,需要以某种方式与用户进行通信?
在" 首先攻击自己:如何进入网络攻击 "中,激活链接将您带到一个可以输入新密码的表单.
如果你正在处理一个网站,那么你可以进入并与网络应用程序交互并选择你自己的新密码.但是使用类似.NET Web API的东西,您正在与通常应该为您提供数据而非用户界面的控制器上的操作进行交互.你不能只是给他们一个链接,并期望他们用它做点什么.
因此,如果您正在通过Web API处理身份验证,那么允许用户重置密码并将新密码传递给他们的有效且安全的方法是什么?
security authentication passwords reset-password asp.net-web-api
示例Json:{"Field1":"","Field2":null}.
在MVC中,默认情况下Field1将被转换为null.我尝试了[DisplayFormat(ConvertEmptyStringToNull = true)]属性(无论如何都应该是默认值)并且它没有什么区别.
我正在使用Web Api 2.1
有任何想法吗?
在我的MVC和WebAPI应用程序中,我看到了两种不同的路由方式.
对于WebAPI:
WebApiConfig.CustomizeConfig(GlobalConfiguration.Configuration);
public static void Register(System.Web.Http.HttpConfiguration config)
{
config.Routes.MapHttpRoute(
name: ApiControllerOnly,
routeTemplate: "api/{controller}");
}
Run Code Online (Sandbox Code Playgroud)
对于MVC:
RouteConfig.RegisterRoutes(RouteTable.Routes);
public static void RegisterRoutes(System.Web.Routing.RouteCollection routes)
{
routes.MapRoute("DefaultRedirect",
"",
new { controller = "Home", action = "Index" });
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释一下我在一个或另一个方法调用中注册路由有什么不同吗?另外,为什么一个人使用这种方式.
c# asp.net-mvc asp.net-mvc-routing asp.net-web-api asp.net-web-api-routing
我在asp.net web api2服务器上有这个代码:
[HttpPost]
[AllowAnonymous]
public IHttpActionResult Login(RequestLogin args)
{
//work
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用参数从" 高级REST客户端 " 发送发送请求:
http://localhost:54382/api/Home/Login
application/json
{"Name":"asd","DeviceId":"818cd41169410e6f20ef55b2917d0e15e5cf072f"}
Run Code Online (Sandbox Code Playgroud)
......它完美无缺!Login方法中的args 已满.
但如果我从Unity3d尝试这个:
UnityWebRequest www;
var url = http://localhost:54382/api/Home/Login;
string jsonObj = JsonUtility.ToJson(request.args);
Debug.Log(jsonObj); //{"Name":"asd","DeviceId":"818cd41169410e6f20ef55b2917d0e15e5cf072f"}
www = UnityWebRequest.Post(url, jsonObj);
www.SetRequestHeader("Content-Type", "application/json; charset=utf-8");
yield return www.Send();
Run Code Online (Sandbox Code Playgroud)
Login方法中的args包含空值.
[Serializable]
public class RequestLogin
{
public string Name;
public string DeviceId;
}
Run Code Online (Sandbox Code Playgroud)
我打破了好几天.请帮帮我
我对Web API中的客户资源进行了DELETE操作.URI看起来像/ customer/1000 /.此操作将由系统在内部停用客户.
在某些情况下,由于他拥有业务付款,客户无法取消.
在成功取消的情况下,API返回200.如果由于待付款而取消,API应该返回什么?我可以返回200但是消息对象作为错误的响应吗?
我正在尝试基本上做标题所说的为了对我的api控制器进行单元测试,但我找不到合适的方法并且无法承担花费太多时间.这是我的代码.
[TestMethod]
public void Should_return_a_valid_json_result()
{
// Arrange
Search search = new Search();
search.Area = "test";
string json = JsonConvert.SerializeObject(search);
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
request.Setup(r => r.HttpMethod).Returns("POST");
request.Setup(r => r.InputStream.ToString()).Returns(json);
context.Setup(c => c.Request).Returns(request.Object);
var controller = new UserController();
controller.ControllerContext = new HttpControllerContext() { RequestContext = context };
//more code
}
Run Code Online (Sandbox Code Playgroud)
最后一行返回错误CS0029无法将类型'Moq.Mock System.Web.HttpContextBase'隐式转换为'System.Web.Http.Controllers.HttpRequestContext'.
我也不确定我应该使用的Moq语法,其他问题,示例和Moq文档对我没什么帮助.
asp.net-web-api ×10
c# ×5
json ×2
android ×1
api ×1
asp.net ×1
asp.net-mvc ×1
async-await ×1
econnrefused ×1
http ×1
moq ×1
passwords ×1
rest ×1
security ×1
unit-testing ×1
url-routing ×1