问题
在我们在项目之间重用的堆栈中,我们在会话中放置了一些过多的数据,用于在页面之间传递数据.这在理论上是好的,因为它可以防止篡改,重放攻击等,但它会产生尽可能多的问题.
会话丢失本身是一个问题,尽管它主要通过实现会话状态服务器(或使用SQL Server)来处理.更重要的是,使后退按钮正常工作非常棘手,而且创建一种情况也是额外的工作,用户可以在三个选项卡中打开相同的屏幕来处理不同的记录.
这只是冰山一角.
大多数这些问题都有解决方法,但是当我磨砺掉时,所有这些摩擦让我觉得使用session在页面之间传递数据是错误的方向.
我真正想要做的是提出一个最佳实践,我的商店可以一直使用它来在页面之间传递数据,然后,对于新的应用程序,替换当前依赖于Session的堆栈的关键部分.
如果最终解决方案不会导致大量的样板管道代码,那也很好.
提出的解决方案
会议
如上所述,严重依赖Session 似乎是一个好主意,但它会打破后退按钮并导致其他一些问题.
可能有办法解决所有问题,但似乎需要做很多额外的工作.
使用会话非常好的一件事是篡改不是问题.与通过未加密的QueryString传递所有内容相比,您最终编写的守护代码更少.
跨页发布
事实上,我几乎没有考虑过这个选择.我有一个问题,它如何使页面紧密耦合 - 如果我开始做PreviousPage.FindControl("SomeTextBox"),这似乎是一个维护问题,如果我想从另一个页面可能没有到达此页面一个名为SomeTextBox的控件.
它似乎也受到其他方面的限制.也许我想通过链接访问该页面.
请求参数
我现在正倾向于这种策略,就像在过去那样.但我可能希望我的QueryString被加密以使其更难以篡改,我也想处理重放攻击的问题.
来自Rolla的4个人,有一篇关于此的文章.
但是,应该可以创建一个HttpModule来处理所有这些并从页面中删除所有加密香肠.果然,Mads Kristensen有一篇文章,他发布了一篇文章.但是,这些评论听起来似乎有极其常见的情况.
其他选择
当然,这不是对选项的详尽看法,而是我正在考虑的主要选项.此链接包含更完整的列表.我没有提到的那些如Cookies和Cache不适合在页面之间传递数据.
在结束...
那么,您如何处理页面之间传递数据的问题?你需要解决什么隐藏的陷阱,是否有任何预先存在的工具可以完美地解决它们?难道你觉得你已经得到了你和完全满意的解决方案?
提前致谢!
更新:以防万一我不够清楚,通过'在页面间传递数据'我正在谈论,例如,将CustomerID密钥从CustomerSearch.aspx页面传递给Customers.aspx,客户将在那里打开并且可以进行编辑.
我在URL中看不到参数和查询字符串之间的差别.那么有什么区别,什么时候应该使用?
假设我有这样的网址:
http://www.example.com?key=123&KEY=198
Run Code Online (Sandbox Code Playgroud)
那将是什么结果
request.querystring("key")
and
request.querystring("KEY")
Run Code Online (Sandbox Code Playgroud)
我有点困惑.
如何将对象序列化为查询字符串格式?我似乎无法在谷歌上找到答案.谢谢.
这是我将序列化的对象作为示例.
public class EditListItemActionModel
{
public int? Id { get; set; }
public int State { get; set; }
public string Prefix { get; set; }
public string Index { get; set; }
public int? ParentID { get; set; }
}
Run Code Online (Sandbox Code Playgroud) 附加查询字符串时总是跳过尾部斜杠是否安全?
也就是说,我可以使用
http://example.com?querystring
Run Code Online (Sandbox Code Playgroud)
代替:
http://example.com/?querystring
Run Code Online (Sandbox Code Playgroud)
?我使用的所有webhost都支持这个,但是可以安全地假设所有服务器环境都支持这种方法吗?这是标准的吗?
我正在使用System.Web.Http.RouteAttribute并System.Web.Http.RoutePrefixAttribute为我的Web API 2应用程序启用更干净的URL.对于我的大部分请求,我可以使用路由(例如Controller/param1/param2)或者我可以使用查询字符串(例如Controller?param1=bob¶m2=mary).
不幸的是,对于我的一个控制器(并且只有一个),这会失败.这是我的控制器:
[RoutePrefix("1/Names")]
public class NamesController : ApiController
{
[HttpGet]
[Route("{name}/{sport}/{drink}")]
public List<int> Get(string name, string sport, string drink)
{
// Code removed...
}
[HttpGet]
[Route("{name}/{drink}")]
public List<int> Get(string name, string drink)
{
// Code removed...
}
}
Run Code Online (Sandbox Code Playgroud)
当我使用路由请求时,两者都可以正常工作.但是,如果我使用查询字符串,它会失败,告诉我该路径不存在.
我已经尝试将以下内容添加到我的WebApiConfig.cs类' Register(HttpConfiguration config)函数(在默认路由之前和之后),但它没有做任何事情:
config.Routes.MapHttpRoute(
name: "NameRoute",
routeTemplate: "{verId}/Names/{name}/{sport}/{drink}",
defaults: new { name = RouteParameter.Optional, sport = RouteParameter.Optional, drink = RouteParameter.Optional },
constraints: new { verId = @"\d+" }); …Run Code Online (Sandbox Code Playgroud) c# query-string asp.net-web-api attributerouting asp.net-web-api-routing
我是C#.net MVC的新手,我正在尝试添加FullCalendar到MVC应用程序.
该FullCalendar脚本自动添加?start={}&end={}到URL ...这很好,但我不知道如何querystring在控制器中使用变量.
我在Webforms应用程序中使用的方法不起作用.我需要添加到控制器以访问querystring变量?
比方说我有一个NSURL?它是否已经有一个空的查询字符串,我如何添加一个或多个参数给query的NSURL?即,有没有人知道这个功能的实现?
- (NSURL *)URLByAppendingQueryString:(NSString *)queryString
Run Code Online (Sandbox Code Playgroud)
这样它就满足了这个NSURL+AdditionsSpec.h文件:
#import "NSURL+Additions.h"
#import "Kiwi.h"
SPEC_BEGIN(NSURL_AdditionsSpec)
describe(@"NSURL+Additions", ^{
__block NSURL *aURL;
beforeEach(^{
aURL = [[NSURL alloc] initWithString:@"http://www.example.com"];
aURLWithQuery = [[NSURL alloc] initWithString:@"http://www.example.com?key=value"];
});
afterEach(^{
[aURL release];
[aURLWithQuery release];
});
describe(@"-URLByAppendingQueryString:", ^{
it(@"adds to plain URL", ^{
[[[[aURL URLByAppendingQueryString:@"key=value&key2=value2"] query] should]
equal:@"key=value&key2=value2"];
});
it(@"appends to the existing query sting", ^{
[[[[aURLWithQuery URLByAppendingQueryString:@"key2=value2&key3=value3"] query] should]
equal:@"key=value&key2=value2&key3=value3"];
});
});
});
SPEC_END
Run Code Online (Sandbox Code Playgroud) 我想从我的网址中删除"语言"查询字符串.我怎样才能做到这一点 ?(使用Asp.net 3.5,c#)
Default.aspx?Agent=10&Language=2
Run Code Online (Sandbox Code Playgroud)
我想删除"语言= 2",但语言将是第一个,中间或最后一个.所以我会有这个
Default.aspx?Agent=20
Run Code Online (Sandbox Code Playgroud) 有没有办法将所有查询字符串名称/值对都放入集合中?
我在.net中寻找内置方式,如果不是,我可以拆分&并加载一个集合.
query-string ×10
asp.net ×4
c# ×4
url ×3
.net ×1
asp.net-mvc ×1
collections ×1
encryption ×1
http ×1
nsurl ×1
object ×1
objective-c ×1
uri ×1
webforms ×1