当我调用时,Response.Redirect(someUrl)
我得到一个HttpException:"在发送HTTP头之后无法重定向".
为什么我这样做?我该如何解决这个问题?
更新2010年10月19日 我知道我刚才问过这个问题,但这些答案中显示的解决方法难以令人满意,对许多人来说,这仍然是一个常见的问题.WCF只是不灵活.我创建了自己的开源C#库,用于在没有WCF的情况下创建REST服务.检查restcake.net或rest.codeplex.com以获取有关所述库的信息. 结束更新
更新8/2/2012 ASP.NET Web API(以前是WCF Web API,REST WCF的替代品)默认情况下 使用Json.NET END UPDATE
在DataContractJsonSerializer
无法处理许多情况下是Json.Net在正确配置(具体周期)处理就好了.
一个服务方法可以返回一个特定的对象类型(在这种情况下是一个DTO),在这种情况下DataContractJsonSerializer
将使用它,或者我可以让该方法返回一个字符串,并自己使用Json.Net进行序列化.问题是当我返回一个json字符串而不是一个对象时,发送到客户端的json用引号括起来.
使用DataContractJsonSerializer
,返回特定的对象类型,响应是:
{"Message":"Hello World"}
使用Json.Net返回json字符串,响应是:
"{\"Message\":\"Hello World\"}"
我不想在客户端上使用eval()或JSON.parse()结果,如果json以字符串形式返回,用引号括起来就是我必须要做的.我意识到这种行为是正确的; 这不是我想要/需要的.我需要原始的json; 当服务方法的返回类型是对象而不是字符串时的行为.
那么,我如何让我的方法返回一个对象类型,但不能使用DataContractJsonSerializer?我怎么能告诉它使用Json.Net序列化器呢?
或者,有没有直接写入响应流?所以我可以自己退回原始的json?没有包装报价?
这是我的人为例子,供参考:
[DataContract]
public class SimpleMessage
{
[DataMember]
public string Message { get; set; }
}
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PersonService
{
// uses DataContractJsonSerializer
// returns {"Message":"Hello World"}
[WebGet(UriTemplate = "helloObject")] …
Run Code Online (Sandbox Code Playgroud) 我希望我能恰当地提出问题的标题.
在c#中,我可以使用lambdas(作为委托),或者使用较旧的委托语法来执行此操作:
Func<string> fnHello = () => "hello";
Console.WriteLine(fnHello());
Func<string> fnHello2 = delegate()
{
return "hello 2";
};
Console.WriteLine(fnHello2());
Run Code Online (Sandbox Code Playgroud)
那么为什么我不能"内联"lambda或委托体,并避免在命名变量中捕获它(使其匿名)?
// Inline anonymous lambda not allowed
Console.WriteLine(
(() => "hello inline lambda")()
);
// Inline anonymous delegate not allowed
Console.WriteLine(
(delegate() { return "hello inline delegate"; })()
);
Run Code Online (Sandbox Code Playgroud)
在javascript中工作的示例(仅用于比较)是:
alert(
(function(){ return "hello inline anonymous function from javascript"; })()
);
Run Code Online (Sandbox Code Playgroud)
这会产生预期的警报框.
更新:看起来你可以在C#中使用内联匿名lambda,如果你适当地进行转换,但是()的数量开始让它变得难以驾驭.
// Inline anonymous lambda with appropriate cast IS allowed
Console.WriteLine(
((Func<string>)(() => "hello inline anonymous …
Run Code Online (Sandbox Code Playgroud) 我有一些使用普通旧IHttpHandler
的REST服务.我想生成更干净的URL,以便我在路径中没有.ashx.有没有办法使用ASP.NET路由创建映射到ashx处理程序的路由?我以前见过这些类型的路线:
// Route to an aspx page
RouteTable.Routes.MapPageRoute("route-name",
"some/path/{arg}",
"~/Pages/SomePage.aspx");
// Route for a WCF service
RouteTable.Routes.Add(new ServiceRoute("Services/SomeService",
new WebServiceHostFactory(),
typeof(SomeService)));
Run Code Online (Sandbox Code Playgroud)
尝试使用会RouteTable.Routes.MapPageRoute()
产生错误(处理程序不会派生出错Page
). System.Web.Routing.RouteBase
似乎只有2个派生类:ServiceRoute
用于服务,DynamicDataRoute
用于MVC.我不确定是什么MapPageRoute()
(Reflector没有显示方法体,它只显示"在NGen图像边界内嵌这种方法的性能至关重要").
我看到它RouteBase
没有密封,并且有一个相对简单的界面:
public abstract RouteData GetRouteData(HttpContextBase httpContext);
public abstract VirtualPathData GetVirtualPath(RequestContext requestContext,
RouteValueDictionary values);
Run Code Online (Sandbox Code Playgroud)
所以也许我可以制作自己的HttpHandlerRoute.我会给出一个镜头,但如果有人知道现有的或内置的映射路由到IHttpHandlers的方式,这将是伟大的.
有没有办法确定ASP.NET应用程序中具有活动会话的用户数?我在特定应用程序中有一个管理员/工具页面,我想显示有关所有打开会话的信息,例如会话数,可能还有请求计算机的地址,或每个用户的其他凭据信息.
我正在为页面上的一些错误/验证元素设置动画.我想让它们反弹并突出显示,但如果可能的话,同时也要突出显示.这是我目前正在做的事情:
var els = $(".errorMsg");
els.effect("bounce", {times: 5}, 100);
els.effect("highlight", {color: "#ffb0aa"}, 300);
Run Code Online (Sandbox Code Playgroud)
这导致元素首先反弹,然后突出显示,我希望它们同时发生.我知道.animate()
您可以queue:false
在选项中指定,但我不想使用动画,因为预先构建的效果"反弹"和"突出显示"正是我想要的.
我试过简单地将这些调用链接起来els.effect().effect()
,但这不起作用.我也尝试queue:false
输入我传入的选项对象,但这不起作用.
我们正在试驾Mercurial.我们不希望每次与存储库交互时都输入我们的用户/传递,因此我们设置了mercurial_keyring扩展.我们:
然后在该[auth]
部分对%userprofile%/ mercurial.ini进行了适当的更改.它在我的同事的计算机(32位xp sp3)上工作正常,但它在我的机器上不起作用(Windows 7 Ultimate x64).另外值得注意的是,必须在Win 7 x64上从源代码构建setuptools(python setup.py bdist_wininst
然后运行生成的setuptools-0.6c11.win-amd64.exe).
仅使用Mercurial 1.5二进制安装(.msi)中的hg.exe,运行hg.exe时出现此错误:
***无法导入扩展名mercurial_keyring:没有名为mercurial_keyring的模块
我试图改变我的mercurial.ini,指定mercurial_keyring.py文件的路径,而不是让mercurial找到它(因为它在PYTHONPATH中).
旧:
[extensions]
mercurial_keyring =
Run Code Online (Sandbox Code Playgroud)
新:
[extensions] mercurial_keyring =
c:/mercurial/extensions/mercurial_keyring.py
Run Code Online (Sandbox Code Playgroud)
错误更改为:
abort:无法导入模块密钥环!
因此,在提供mercurial_keyring扩展的路径时,仍然无法找到依赖密钥环模块.
经过进一步调查,似乎NO扩展工作.他们都产生错误:
***无法导入扩展名[扩展名]:没有名为[模块名称]的模块
看来,当运行hg.exe时,它不知道PYTHONPATH.我试过了:
什么都行不通.我最接近的是从源代码构建时使用hg.py. 它至少不会给我错误,并且当我输入我的凭据时实际创建%userprofile%/ wincrypto_pass.cfg.但是在后续请求中,它不会自动输入凭据.它再次提示我.
有趣的是,TortoiseHG 正在使用密钥环.我无法让它在命令行上运行.我认为Win 7 x64正在发生一些阻止mercurial(hg.exe)看到PYTHONPATH的事情,因此无法找到任何已安装的模块.
有没有人在Win 7 x64上有扩展功能?具体用二进制安装mercurial(不是hg.py)?
更新 我现在找到了合适的工作.由于TortoiseHG 不会与mercurial_keyring工作,我只是改变了我的PATH设置为包括tortoiseHG文件夹,而不是C:\善变.现在当我在命令行输入"hg"时,它正在使用tortoiseHG文件夹中的hg.exe,它可以正常工作.同样,这仍然是Win 7 x64上的mercurial扩展的问题.答案欢迎.
考虑:
//在Vector2.h中
class Vector2
{
public:
// returns the degrees in radians
static double calcDir(double x, double y);
}
Run Code Online (Sandbox Code Playgroud)
//在Vector2.cpp中
double Vector2::calcDir(double x, double y)
{
double rad = ...;
return rad;
}
Run Code Online (Sandbox Code Playgroud)
为什么Vector2.cpp中的签名不需要关键字static?当我尝试这个时,它会产生一个错误:
static double Vector2::calcDir(double x, double y)
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎不一致.方法签名的所有其他部分都需要在.cpp文件中重复(返回类型,方法名称(duh),args的名称和类型,const-ness).我不喜欢一眼就知道方法是否是静态的(在查看实现时).
有没有理由这不仅不是必需的,而且是禁止的?
我正在研究.NET 4项目,并且能够从HyperDescriptor提供的动态属性访问中受益,但是当在.NET 4中构建时,它似乎无法正常工作.我从CodeProject下载了源代码,将解决方案的项目转换为VS2010,并将目标框架更新为4.0.在构建并且示例正确执行时,时序显示使用HyperDescriptor进行动态属性访问是获取/设置对象值的最慢方式.
只有在使用.NET 4从源代码构建HyperDescriptor时才会出现此问题.如果从.NET 4项目中添加对使用.NET 2构建的HyperDescriptor的引用,则可以正常工作.这是目前可接受的解决方案,但是使用.NET 4构建会有一些潜在的优势吗?任何人都想在HyperDescriptor上破解,看看为什么.NET 4版本的速度如此之慢?