2016-12-03 7 views
0

私はIServerインターフェイスのカスタム実装とサンプルasp.netコアアプリをしたでは動作しません:カスタムIServerの実装には、次のようIISIntegration

namespace AspNetCoreAppWithOwinHttpListenerServer 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      IWebHost host = new WebHostBuilder() 
       .UseHttpListener() 
       .UseIISIntegration() 
       .UseStartup<Startup>() 
       .Build(); 

      host.Run(); 
     } 
    } 

    public class OwinHttpListenerServer : IServer 
    { 
     private IDisposable _HttpListenerServer; 

     public IFeatureCollection Features { get; } = new FeatureCollection(); 

     public OwinHttpListenerServer() 
     { 
      Features.Set<IServerAddressesFeature>(new ServerAddressesFeature()); 
     } 

     public void Start<TContext>(IHttpApplication<TContext> application) 
     { 
      Func<IDictionary<string, object>, Task> appFunc = async env => 
      { 
       FeatureCollection features = new FeatureCollection(new OwinFeatureCollection(env)); 

       TContext context = application.CreateContext(features); 

       try 
       { 
        await application.ProcessRequestAsync(context); 
       } 
       catch (Exception ex) 
       { 
        application.DisposeContext(context, ex); 
        throw; 
       } 

       application.DisposeContext(context, null); 

      }; 

      appFunc = OwinWebSocketAcceptAdapter.AdaptWebSockets(appFunc); 

      Dictionary<string, object> props = new Dictionary<string, object>(); 

      props["host.Addresses"] = Features 
       .Get<IServerAddressesFeature>() 
       .Addresses 
       .Select(add => new Uri(add)) 
       .Select(add => new Address(add.Scheme, add.Host, add.Port.ToString(), add.LocalPath).Dictionary) 
       .ToList(); 

      OwinServerFactory.Initialize(props); 

      _HttpListenerServer = OwinServerFactory.Create(appFunc, props); 
     } 

     public void Dispose() 
     { 
      _HttpListenerServer?.Dispose(); 
     } 
    } 

    public static class OwinHttpListenerWebHostBuilderExtensions 
    { 
     public static IWebHostBuilder UseHttpListener(this IWebHostBuilder builder) 
     { 
      return builder.ConfigureServices(services => 
      { 
       services.AddSingleton<IServer, OwinHttpListenerServer>(); 
      }); 
     } 
    } 
} 

それは、IISなしで正常に動作しますが、IISまたはIISExpress結果で実行されていますVSIISExeLauncher.exeによって「指定されたポートでリッスンしませんでした」。

カスタムサーバーをIISと互換性を持たせるにはどうすればよいですか? ありがとうございます。

GitHubのリポジトリ:https://github.com/ymoradi/AspNetCoreAppWithOwinHttpListenerServer

答えて

1

AspNetCoreModule(IIS)は、HTTP.SYSベースのサーバーと互換性がありません。 https://github.com/aspnet/AspNetCoreModule/issues/23

+0

ええ、私はそれを知っています。しかし、自分の実装にも何か問題があると思います。私は、「やれ」も使うことができません。そのサーバーは.NETで完全に実装されており、.NET/WindowsのHTTP Listenerやhttp.sysに依存しません。 –

+0

私の質問を削除できませんでした。私はNowinの実装で新しいものを開きます。私の最後のコメント、Nowinはhttp.sysに依存しません.HttpListener自体はhttp.sysに基づいています。これは私がそれを知らなかったことです。 (:ありがとう –

0

を参照してくださいOwinHttpListenerは、.NET HttpListenerClassに基づいており、そのクラスは、HTTP.sysのの助けによって実装されます。 http.sysはカーネルモードのコードですが、現在はasp.netコアiisモジュールのサポートはありません。

関連する問題