Tag: 自托管

HttpListener与JWT和Basic auth:如何发送WWW-Authenticate? (自托管)

我有一个在mono / .NET上运行跨平台的自托管REST应用程序。 一个问题是HttpListener管理和阻止WWW-Authenticate头的手动设置。 如果您将自己限制为内置的Basic,NTLM等身份validation,或者不需要身份validation,那么这很好,但如果您想接受任何其他类型的令牌,则会出现问题。 我正在使用带有REST样式接口的JWT令牌,使用Basic [1] auth进行初始身份validation。 在应用程序的另一部分,我正在做类似的事情,但使用自定义令牌和/或Basic auth作为API的另一部分的后备。 问题是: 如何让HttpListener发送“WWW-Authenticate:Basic”质询标题,同时还允许非基本授权令牌通过? 我已经尝试在听众中设置Basic和Anonymous: _listener.AuthenticationSchemes = AuthenticationSchemes.Basic | AuthenticationSchemes.Anonymous; 这导致在任何情况下都不返回WWW-Authenticate头。 我相信这应该允许基本或未经身份validation的连接,并且当我将状态代码设置为401(HttpStatusCode.Unauthorized)时,还应该设置WWW-Authenticate挑战。 但它没有(在mono或.NET上)。 如果我只设置AuthenticationSchemes.Basic,HttpListener会拒绝所有没有Basic样式标记的连接,这对于远程用途并不重要。 明显但蹩脚的解决方法: 目前我只是违反HTTP规范并返回401而没有WWW-Authenticate标头。 这有效,但会降低与第三方工具的兼容性。 我考虑使用完全不同的HttpListener实现,尽管大多数似乎是在原型阶段或自己的大型库的一部分。 我考虑过编写自己的HttpListener,但是在那时将整个应用程序移植到Java开始看起来很有吸引力。 我想找到比完整的平台端口或编写我自己的库更少工作的建议。 想法? [1] – 此处需要基本身份validation,以便与低级脚本和其他一些系统向后兼容。 请假设我了解安全隐患并使用SSL等。

如何为没有SVC文件的自托管WCF服务指定ServiceHostFactory

我的应用程序作为Windows服务运行。 它使用以下帮助器方法动态创建WCF服务: public static void StartWebService(string webServiceName, Type serviceContractType, Type serviceImplementationType) { if (string.IsNullOrEmpty(webServiceName)) return; var baseAddress = GetWebServiceAddress(webServiceName); var baseUri = new Uri(baseAddress); lock (RunningWebServices) { if (RunningWebServices.ContainsKey(webServiceName)) return; var webServiceHost = new ServiceHost(serviceImplementationType, baseUri); var serviceBehaviour = new ServiceMetadataBehavior() { HttpGetEnabled = true }; webServiceHost.Description.Behaviors.Add(serviceBehaviour); webServiceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexHttpBinding(), “mex”); var httpBinding = new BasicHttpBinding(); […]

从自托管的WEB API控制台应用程序返回jsonp

我使用了这篇博客文章中描述的jsonp格式化程序: http : //www.west-wind.com/weblog/posts/2012/Apr/02/Creating-a-JSONP-Formatter-for-ASPNET-Web-API 有没有人尝试将格式化程序与自托管控制台应用程序一起使用? 我在常规的MVC 4项目中尝试过格式化程序,它立即起作用。 但是,我想在自托管控制台应用程序中使用它,我在使用它时遇到了很多麻烦。 我已注册格式化程序,并validation它已添加: var config = new HttpSelfHostConfiguration(serviceUrl); config.Formatters.Insert(0, new JsonpMediaTypeFormatter()); 我已经validation在使用以下代码发出请求时正在调用格式化程序: $(“#TestButton”).click(function () { $.ajax({ url: ‘http://localhost:8082/Api/Test’, type: ‘GET’, dataType: ‘jsonp’, success: function(data) { alert(data.TestProperty); } }); }) 我已经检查了Fiddler,我得到的回答是: HTTP/1.1 504 Fiddler – Receive Failure Content-Type: text/html; charset=UTF-8 Connection: close Timestamp: 09:30:51.813 [Fiddler] ReadResponse() failed: The server did […]

如何让Swagger插件在自托管服务堆栈中工作

我已经通过github提供的示例重新提出了这个问题,并为任何想要自己运行代码的人提供了一个下拉框下载链接: Swagger没有在自托管的ServiceStack服务上工作 我在我的网站解决方案中运行了我的servicestack JSON服务,在’/ api / path下,但现在我想拆分该服务堆栈部分并将其作为自托管Windows服务运行。 我的问题是,我自己和其他开发人员发现Swagger插件对于测试目的非常有用,但现在它是自托管的,似乎HTTPHandler只设置为仅处理服务路由,而纯HTML不起作用。 我该如何解决? URL: http://localhost:8081/Swagger-UI/Index.html 回应: Handler for Request not found: Request.HttpMethod: GET Request.HttpMethod: GET Request.PathInfo: /Swagger-UI/Index.html Request.QueryString: Request.RawUrl: /Swagger-UI/Index.html 安装Nuget包: ServiceStack ServiceStack.Razor @marfarma的更新 我的app.config文件里面没有任何相关的ServiceStack …… Program.cs: AppHostHttpListenerBase appHost = new my.HttpApi.myApiServiceHostBase(“My Service”, “my.ApiService”); string listeningURL = “http://localhost:8081/”; var appSettings = new ServiceStack.Configuration.AppSettings(); my.HttpApi.FakeProvider.ProductProvider.Init(appSettings); my.HttpApi.FakeProvider.UserProvider.Init(appSettings); #if DEBUG try { […]

ServiceStack Selfhosted应用程序重新启动

如何重新启动ServiceStack自托管Apphost? 将我的AppHost实例设置为null并处理它无法正常工作,它会抛出以下exception: System.ArgumentException: An entry with the same key already exists. 我需要能够重新加载设置并启动AppHost,而无需重新启动托管AppHost的Windows服务 编辑:Scott和Moo-Juice建议在不同的AppDomain中运行AppHost是正确的解决方案。 为了通过Cross Domain调用来重新启动AppHost,我创建了第二个AppHost,它在Main AppDomain中运行,并从Scott的解决方案中调用Restart方法。 在两个AppHost实例上启用CORS允许简单的$ ajax调用来重新启动服务,并在服务启动并返回请求后重新加载页面。

将证书注册到SSL端口

我有一个Windows服务(作为LocalSystem运行),它自我托管OWIN服务(SignalR),需要通过SSL访问。 我可以在我的本地开发机器上设置SSL绑定 – 我可以在同一台机器上通过SSL访问我的服务。 但是,当我去另一台机器并尝试运行以下命令时,我收到一个错误: 命令: netsh http add sslcert ipport=0.0.0.0:9389 appid={…guid here…} certhash=…cert hash here… 错误: SSL证书添加失败,错误:1312 指定的登录会话不存在。 它可能已被终止。 我使用的证书是完全签名的证书(不是开发证书),可以在我的本地开发框中使用。 这就是我在做的事情: Windows服务启动并使用以下代码注册我的证书: var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine); store.Open(OpenFlags.ReadWrite); var path = AppDomain.CurrentDomain.BaseDirectory; var cert = new X509Certificate2(path + @”\mycert.cer”); var existingCert = store.Certificates.Find(X509FindType.FindByThumbprint, cert.Thumbprint, false); if (existingCert.Count == 0) store.Add(cert); store.Close(); 然后我尝试使用netsh和以下代码将证书绑定到端口9389: var […]

使用HttpServer或HttpSelfHostServer对Web API进行unit testing

我正在尝试为Web API项目进行一些unit testing。 我要模拟Web API托管环境。 好像我可以使用内存主机(HttpServer)或自主机(HttpSelfHostServer)。 只是想知道有什么区别,哪种技术对什么有好处,并且对这些选项有任何限制。

Web API自托管主机 – 在所有网络接口上绑定

如何在所有网络接口上进行Web API自主绑定? 我目前有以下代码。 不幸的是,它仅绑定在localhost上。 因此,从localhost以外的地方访问此服务器失败。 var baseAddress = string.Format(“http://localhost:9000/”); using (WebApp.Start (baseAddress)) { Console.WriteLine(“Server started”); Thread.Sleep(1000000); }

System.ServiceModel.AddressAccessDeniedException:HTTP无法注册URL http :: 8080

我创建了我的第一个自托管WCF服务。 我在C#控制台应用程序中托管它,但它抛出一个错误: System.ServiceModel.AddressAccessDeniedException:HTTP无法注册URL http:8080 当我以管理员身份运行Visual Studio 2013时,它运行良好,但如果我不这样做则不行。 那么任何方法来自动完成它而不是作为ADMIN启动VS? 到目前为止,我创建了一个HelloService类库,其中我添加了一个WCF服务,该服务由一个接口IHelloService和HelloService 。 IHelloService : namespace HelloService { [ServiceContract] public interface IHelloService { [OperationContract] String GetMsg(); } } HelloService : namespace HelloService { public class HelloService : IHelloService { public String GetMsg() { return “Service Accessed”; } } } 然后我创建了一个C#控制台应用程序HelloServiceHost ,它有一个app.config文件: 和program.cs文件: using HelloService; using System.ServiceModel; namespace HelloServiceHost […]

如何远程访问自托管的Nancy服务?

我正在创建一个简单的Windows服务,它承载一个Nancy实例来提供其内部数据的视图。 在本地计算机上使用浏览器时,一切都按预期工作; 我看到它提供的观点。 但是,我找不到任何理由不能从远程浏览器(在同一网络上)访问。 从远程浏览器访问只会延迟一段时间; IE将最终显示“此页面无法显示”; iPad上的Safari会在一段时间内显示部分进度条并且不执行任何操作。 我使用所有本地IP绑定,而不仅仅是localhost。 我在此链接上使用GetUriParams()函数来发现绑定的所有本地IP地址。 http://www.codeproject.com/Articles/694907/Embed-a-web-server-in-a-windows-service _nancyHost = new NancyHost(GetUriParams(port)); _nancyHost.Start(); 我在这个页面上发现绑定到localhost仅适用于本地访问。 http://forums.asp.net/t/1881253.aspx?More+SelfHost+Documentation 此function发现的IP适用于以前安装VMware播放器的以太网适配器,无线适配器和两个VMware网络适配器。 我已尝试通过机器名称和文字IP远程访问以太网适配器。 我在urlacl列表中添加了条目。 我已经在很多地方使用了netsh http add urlacl命令,包括在这个链接: 远程访问Nancy Self Host 如果我执行netsh http show urlacl ,我会看到我正在使用的端口的条目。 我尝试了不同的Nancy配置如果我为UrlReservations.CreateAutomatically设置Nancy配置选项,我将获得安全提示,在允许之后,我在netsh http show urlacl看到新条目netsh http show urlacl所有本地IP的netsh http show urlacl列表输出,但它仍然没有允许远程访问。 我还尝试了RewriteLocalHost选项true和false。 我尝试使用http://+:3684或http://*:3684 (从Uri()获取解析exception)和http://0.0.0.0:3684 (从AddAllPrefixes()获取exception) AddAllPrefixes()在HttpListener() )中。 我将EXE添加到Windows防火墙我已经创建了防火墙例外,如下所述: https : //msdn.microsoft.com/en-us/library/ms733768.aspx 关联规则显示具有TCP和UDP的每个列的Private,Public和“Any”。 我尝试在不同的环境中运行Nancy。 我运行了以下代码:作为本地系统运行的Windows服务,Visual […]