2014年8月22日星期五

PowerShell:Linux程序员喜欢的cmd增强版 - 超爱fitnesse

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
PowerShell:Linux程序员喜欢的cmd增强版 - 超爱fitnesse  阅读原文»

Linux程序员有时偶尔使用Windows下的cmd工具,会被逼疯的,有些命令ls, cat, ps等已经条件反射一样使用。
但在cmd下,根本不知道该用什么命令,好在盖兹大叔照顾了此部分需求。从Vista开始,推出了PowerShell工具。

PowerShell工具不仅完全包含cmd所有功能,特别对于Linux程序员有两大利好:

  1. 增强的tab补全命令
  2. Unix常用命令ls, cat, ps等的支持,但是参数格式完全不同,所以不要期望太高。

在此输入图片描述

在此输入图片描述

请注意:

  1. 从C:进入D:的某个目录,不需要分两步,直接 cd D:\xx即可
  2. 别使用仿Unix命令的任何参数,这里的ls等只是一个PowerShell内部命令的别名。

Windows PowerShell ISE > 帮助 > Windows PowerShell 帮助:
在此输入图片描述

在此输入图片描述

其余不再罗嗦,有兴趣自己试试吧。

各位客官如果还不满意,就在Windows下使用其他替代方案:

  1. Cygwin
  2. MSYS-MinGW
  3. SFU

本文链接:PowerShell:Linux程序员喜欢的cmd增强版,转载请注明。

$.ajax 跨域请求 Web Api - stoneniqiu  阅读原文»

WepApi确实方便好用,没有配置文件,一个apicontroller直接可以干活了。但今天用$.ajax跨域请求的时候总是获取不到数据,用fiddler一看确实抓到了数据,但回到$.ajax函数中,直接触发了error,没有触发success,即使状态码是200。用apiclient或者浏览器直接访问都是ok的。搜罗一番。最终在这篇文章上面找到答案 。http://code.msdn.microsoft.com/windowsdesktop/Implementing-CORS-support-a677ab5d

原因

在默认情况下,为防止CSRF跨站伪造攻击,一个网页从另外一个域的网页获取数据的时候就会受到限制。有一些方法可以突破这个限制,JSONP就是其一。它使用<script> 标签加一个回调函数。但JSONP 只支持Get方法。而CORS(Cross-Origin Resource Sharing) 跨域资源共享,是一种新的header规范,可以让服务器端放松跨域的限制,可以根据header来切换限制或不限制跨域请求。它支持所有的Http请求方式。跨域的资源请求带有一个Http header:Origin,如果服务器支持CORS,响应就会带有一个header:Access-Control-Allow-Origin ,也有一些特殊的请求。采用 HTTP “OPTIONS” 的方式,hearder中带有Access-Control-Request-Method或Access-Control-Request-Headers,服务器响应的hearder中需要带有Access-Control-Allow-Methods,Access-Control-Allow-Headers才行。

实现

那怎么实现CORS呢,这用到了Message Handler。它可以在管道中拦截并修改Request,代码如下:

public class CorsHandler : DelegatingHandler
{
const string Origin = "Origin";
const string AccessControlRequestMethod = "Access-Control-Request-Method";
const string AccessControlRequestHeaders = "Access-Control-Request-Headers";
const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
const string AccessControlAllowMethods = "Access-Control-Allow-Methods";
const string AccessControlAllowHeaders = "Access-Control-Allow-Headers";

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
bool isCorsRequest = request.Headers.Contains(Origin);
bool isPreflightRequest = request.Method == HttpMethod.Options;
if (isCorsRequest)
{
if (isPreflightRequest)
{
return Task.Factory.StartNew<HttpResponseMessage>(() =>
{
HttpResponseMessage response
= new HttpResponseMessage(HttpStatusCode.OK);
response.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());

string accessControlRequestMethod = request.Headers.GetValues(AccessControlRequestMethod).FirstOrDefault();
if (accessControlRequestMethod != null)
{
response.Headers.Add(AccessControlAllowMethods, accessControlRequestMethod);
}

string requestedHeaders = string.Join(", ", request.Headers.GetValues(AccessControlRequestHeaders));
if (!string.IsNullOrEmpty(requestedHeaders))
{
response.Headers.Add(AccessControlAllowHeaders, requestedHeaders);
}

return response;
}, cancellationToken);
}
else
{
return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>(t =>
{
HttpResponseMessage resp
= t.Result;
resp.Headers.Add(AccessControlAllowOrigin, request.Headers.GetValues(Origin).First());
return resp;
});
}
}
else
{
return base.SendAsync(request, cancellationToken);
}
}
}

然后在Global中加入:

protected void Application_Start(object sender, EventArgs e)
{
GlobalConfiguration.Configuration.MessageHandlers.Add(
new CorsHandler());
WebApiConfig.Register(GlobalConfiguration.Configuration);
}

脚本:

$.ajax({
// url: "http://localhost:11576/api/Values",
url: "http://localhost:39959/api/user/login?name=niqiu&pwd=123456",
type:
"GET",
//contentType: "application/json;",
success: function(result) {
alert(result.status);
},
error:
function (XMLHttpRequest, textStatus, errorThrown) {
alert(
"出错!XMLHttpRequest:" + XMLHttpRequest.status);
}
});

这样访问就ok了。


本文链接:$.ajax 跨域请求 Web Api,转载请注明。

阅读更多内容

没有评论:

发表评论