1,创建Windows Service;
2,使用NuGet 添加 安装三个组件,其他组件会随着这三个组件的安装自动安装;(管理解决方案的NuGet程序包)
4,基本配置、注册服务
class Program
{
static void Main(string[] args)
{
Console.ReadLine();
Host host = HostFactory.New(x =>
{ // 基本的配置
x.RunAsLocalSystem();
x.SetServiceName("Service");
x.SetDisplayName("Service");
x.SetDescription("服务");
x.StartAutomatically();
x.EnableShutdown();
// 注册服务
x.Service<Service>(hostSettings => new Service());
// 设置服务失败后的操作,分别对应第一次、第二次、后续
x.EnableServiceRecovery(t =>
{
t.RestartService(0);
t.RestartService(0);
t.RestartService(0);
t.OnCrashOnly();
});
});
host.Run();
}
}
5,注册路由
public class RegisterRoutesStartup
{
public void Configuration(IAppBuilder appBuilder)
{
HttpConfiguration config = new HttpConfiguration();
//自定义路由
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "socketApi/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//只响应Json请求
var jsonFormatter = new JsonMediaTypeFormatter();
config.Services.Replace(typeof(IContentNegotiator), new JsonContentNegotiator(jsonFormatter));
appBuilder.UseWebApi(config);
}
}
public class JsonContentNegotiator : IContentNegotiator
{
private readonly JsonMediaTypeFormatter jsonMediaTypeFormatter;
public JsonContentNegotiator(JsonMediaTypeFormatter formatter)
{
this.jsonMediaTypeFormatter = formatter;
}
public ContentNegotiationResult Negotiate(Type type, HttpRequestMessage request, IEnumerable<MediaTypeFormatter> formatters)
{
var result = new ContentNegotiationResult(this.jsonMediaTypeFormatter, new MediaTypeHeaderValue("application/json"));
return result;
}
}
6,创建Service
public class Service : ServiceControl
{
private string hostSocket;
private IDisposable hostObject;
public bool Start(HostControl hostControl)
{
//hostSocket = Const.GetIpAddress();
hostObject = WebApp.Start<RegisterRoutesStartup>("http://localhost:8088");
// 开始具体的业务逻辑
return true;
}
public bool Stop(HostControl hostControl)
{
// 结束
hostObject.Dispose();
return true;
}
}
7,创建跨域属性
public class CrossSiteAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
private const string Origin = "Origin";
/// <summary>
/// Access-Control-Allow-Origin是HTML5中定义的一种服务器端返回Response header,用来解决资源(比如字体)的跨域权限问题。
/// </summary>
private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin";
/// <summary>
/// originHeaderdefault的值可以使 URL 或 *,如果是 URL 则只会允许来自该 URL 的请求,* 则允许任何域的请求
/// </summary>
private const string originHeaderdefault = "*";
/// <summary>
/// 该方法允许api支持跨域调用
/// </summary>
/// <param name="actionExecutedContext"> 初始化 System.Web.Http.Filters.HttpActionExecutedContext 类的新实例。</param>
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
actionExecutedContext.Response.Headers.Add(AccessControlAllowOrigin, originHeaderdefault);
}
}
8,简单建立一个测试的API
[CrossSite]
public class DemoController : ApiController
{
/// <summary>
/// 访问 http://localhost:8088/socketApi/Demo/Test/1
/// socketApi/{controller}/{action}/{id}
/// </summary>
/// <returns></returns>
[HttpGet]
public string Test(string id)
{
return id+",Are you ok?";
}
}
[CrossSite]尤其重要,以此来标识是否支持跨域访问.