2017-11-24 30 views
0

リモートsrver上のIISにバインディングを追加できるサービスを作成しようとしています。私はMicrosoft.Web.Administrationを使用しています。 バインディングを追加するには私のコードは次のようになります。.Net CoreおよびMicrosoft.Web.Administration

public static bool AddSiteBinding(string siteName, string ipAddress, string tcpPort, string hostHeader, string protocol) 
    { 
     try 
     { 
      if (string.IsNullOrEmpty(siteName)) 
      { 
       throw new ArgumentNullException("siteName", "AddSiteBinding: siteName is null or empty."); 
      } 
      //get the server manager instance 

      using (ServerManager mgr = ServerManager.OpenRemote(@"\\Qasql01\c$\Windows\System32\inetsrv\config\applicationHost.config")) 
      //using (ServerManager mgr = new ServerManager()) 
      { 
       SiteCollection sites = mgr.Sites; 
       Site site = mgr.Sites[siteName]; 
       if (site != null) 
       { 
        string bind = ipAddress + ":" + tcpPort + ":" + hostHeader; 
        //check the binding exists or not 
        foreach (Binding b in site.Bindings) 
        { 
         if (b.Protocol == protocol && b.BindingInformation == bind) 
         { 
          throw new Exception("A binding with the same ip, port and host header already exists."); 
         } 
        } 
        Binding newBinding = site.Bindings.CreateElement(); 
        newBinding.Protocol = protocol; 
        newBinding.BindingInformation = bind; 
        site.Bindings.Add(newBinding); 
        mgr.CommitChanges(); 
        return true; 
       } 
       else 
        throw new Exception("Site: " + siteName + " does not exist."); 
      } 
     } 
     catch (Exception ex) 
     { 
      throw new Exception(ex.Message, ex); 
     } 
    } 

問題は、それがリモートサーバーに対して実行だとき(ローカルで正常に動作します)このコードがObject reference not set to an instance of an object.エラーで吹くことです。この場合のリモートサーバーは、Windows Server 2012上のIIS 8.5です。私はすべての幸運なしに見つけることができるすべてのソリューションを試しました。私は管理者として実行されているVS 2017からこのコードを実行しています。サーバーをオフにファイアウォールを回さIIS管理ツールは、サーバー

  • にインストールされていることを確認済みでDCOMが設定されていることを確認済み

    1. とahaadmin
    2. で特定のエンドポイントを追加しました:ここに私が試したものです。
    3. UACでOFF
    4. 確認済み私はMicrosoft.Web.Administration DLL
    5. の正しいバージョンを持っていることを、私は、IPアドレスを入力し、サーバー上の設定、およびサーバー名へのリモートパスを試してみました。

    IISのバージョンが異なるため、私のローカルマシンで自分のソリューションをテストできません。最終的には、Windows 10では使用できないIIS機能である「中央証明書ストア」にSSL証明書を追加するためのコードを記述します。実際には「OpenRemote」が必要ですが、そうではないようです。 MicrosoftからServerManager.OpenRemote()メソッドの例はありません。私が見つけた例は、単に動作しません(ほとんどのIIS7参照)。私は、OpenRemoteメソッドがIIS7を超えるものでは決してテストされていないと考え始めています。 ServerManager.OpenRemote()をIIS 8.5に対して正常に使用している人はいますか?

    アップデート:私はちょうどこれを考え出し VS Debug

  • +0

    MWAはどれですか? NuGetバージョンは使用できません。 –

    +0

    ヌル参照例外ではどの行が爆発するのですか? – virusstorm

    +0

    @virusstorm 'mgr'をインスタンス化するusingステートメントの直後の行。もちろん、mgrがnullのため、 'mgr.Sites'にアクセスすることはできません。それは決して作成されません。 @Lex Li私は、Microsoftによると.Netコアと互換性があり、動作するNuGetバージョンのバージョン[11.0](https://www.nuget.org/packages/Microsoft.Web.Administration/)を使用しています。 2016年10月、マイクロソフトはMWAを引き継ぎ、公式のNuGetパッケージにしました。だから今はMicrosoftによって所有され維持されている。 – user2033791

    答えて

    0

    OK:ここで私は、デバッグ中にVSで見るもののPICがあります。まず、私はOpenRemoteが機能しないと確信しています。私が読んだ記事では、設定ファイルでOpenRemoteを渡す例が示されました。これは正しくありません。 MSのコードをちょっと調べてみると、applicationHost.configのパスを受け付けるコンストラクタがありますが、設定パスを受け入れるOpenRemoteのバージョンはありません。これは、IIS 7と以前のバージョンのMWAでは機能していた可能性がありますが、確かにこのバージョンではない可能性があります。もちろん、ServerまたはIPで渡すこともできません。私は、ServerManagerをインスタンス化する行を次のように変更しました。

    using (ServerManager mgr = new ServerManager(@"\\qasql01\IISSharedConfig\applicationHost.config")) 
    

    これで動作します。これは、リモートサーバーを構成する唯一の方法と思われます。少なくともこの方法では、通常のファイルセキュリティを使用し、すべてのDCOMの神秘的なセキュリティ要件を回避できます。

    関連する問題