none
Visual Studio 2012の「拡張機能と更新プログラム」が動きません RRS feed

  • 質問

  • メニューから「ツール」→「拡張機能と更新プログラム」→「更新プログラム」→「Visual Studio ギャラリー」で、「サーバーへの接続中のエラーが発生したため、更新プログラムを確認できませんでした」というエラーが発生します。

    その下にはメッセージを受信できる http://marketplace.visualstudio.com/services/VS2012/Extension.svc でリッスンしているエンドポイントがありませんでした」とあります。現在、上記のURLはhttpsにリダイレクトされているようで、おそらくこれが原因だと思われますが、解決方法についてアドバイスをお願いします

    2021年3月5日 5:53

回答

  • VS2012からはhttpでしかアクセスできない。marketplaceはhttpsでしか受け付けないので、プロキシを作ってhttpアクセスをhttpsに流してやります。

    ギャラリーのアクセス先はレジストリに登録すると変更できるので、localhostに変更します。

    Windows Registry Editor Version 5.00
    
    [HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\ExtensionManager\Repositories\{0f45e408-7995-4375-9485-86b8db553dc9}]
    @="http://localhost:33333/"
    

    このローカルホストで待ち受けるプログラムを作ります。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                //System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3 | System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
                try
                {
                    const string DUMMY = "http://localhost:33333/";
                    const string MARKETPLACE = "https://marketplace.visualstudio.com/services/VS2012/Extension.svc";
    
                    System.Net.HttpListener listener = new System.Net.HttpListener();
                    listener.Prefixes.Clear();
                    listener.Prefixes.Add("http://localhost:33333/");
    
                    listener.Start();
    
                    Console.WriteLine("Start");
    
                    for (; ; )
                    {
                        var context = listener.GetContext();
                        var req = context.Request;
                        System.IO.StreamReader sr = new System.IO.StreamReader(req.InputStream, new System.Text.UTF8Encoding());
                        var text = sr.ReadToEnd();
    
                        text = text.Replace(DUMMY, MARKETPLACE);
    
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine(text);
    
                        var scon = new System.Net.Http.StringContent(text, new System.Text.UTF8Encoding(), "application/soap+xml");
                        System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
                        var response = client.PostAsync(MARKETPLACE, scon).Result;
                        Console.ForegroundColor = ConsoleColor.Magenta;
                        Console.WriteLine(response);
    
                        context.Response.StatusCode = (int)response.StatusCode;
                        if (response.StatusCode == System.Net.HttpStatusCode.OK)
                        {
                            var stream = (response.Content as System.Net.Http.StreamContent).ReadAsStreamAsync().Result;
                            context.Response.Headers.Add("Content-Type", "application/soap+xml");
                            stream.CopyTo(context.Response.OutputStream);
                        }
                        context.Response.Close();
    
                        Console.ResetColor();
                        Console.WriteLine("CLOSE");
                    }
                }
                catch (Exception ex)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(ex.Message);
                }
    
                Console.WriteLine("END");
                Console.ReadKey();
            }
        }
    }

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク S100TG_USER 2021年3月9日 4:56
    2021年3月7日 20:08

すべての返信

  • VS2012からはhttpでしかアクセスできない。marketplaceはhttpsでしか受け付けないので、プロキシを作ってhttpアクセスをhttpsに流してやります。

    ギャラリーのアクセス先はレジストリに登録すると変更できるので、localhostに変更します。

    Windows Registry Editor Version 5.00
    
    [HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\11.0_Config\ExtensionManager\Repositories\{0f45e408-7995-4375-9485-86b8db553dc9}]
    @="http://localhost:33333/"
    

    このローカルホストで待ち受けるプログラムを作ります。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleApp1
    {
        class Program
        {
            static void Main(string[] args)
            {
                //System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Ssl3 | System.Net.SecurityProtocolType.Tls | System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;
                try
                {
                    const string DUMMY = "http://localhost:33333/";
                    const string MARKETPLACE = "https://marketplace.visualstudio.com/services/VS2012/Extension.svc";
    
                    System.Net.HttpListener listener = new System.Net.HttpListener();
                    listener.Prefixes.Clear();
                    listener.Prefixes.Add("http://localhost:33333/");
    
                    listener.Start();
    
                    Console.WriteLine("Start");
    
                    for (; ; )
                    {
                        var context = listener.GetContext();
                        var req = context.Request;
                        System.IO.StreamReader sr = new System.IO.StreamReader(req.InputStream, new System.Text.UTF8Encoding());
                        var text = sr.ReadToEnd();
    
                        text = text.Replace(DUMMY, MARKETPLACE);
    
                        Console.ForegroundColor = ConsoleColor.Green;
                        Console.WriteLine(text);
    
                        var scon = new System.Net.Http.StringContent(text, new System.Text.UTF8Encoding(), "application/soap+xml");
                        System.Net.Http.HttpClient client = new System.Net.Http.HttpClient();
                        var response = client.PostAsync(MARKETPLACE, scon).Result;
                        Console.ForegroundColor = ConsoleColor.Magenta;
                        Console.WriteLine(response);
    
                        context.Response.StatusCode = (int)response.StatusCode;
                        if (response.StatusCode == System.Net.HttpStatusCode.OK)
                        {
                            var stream = (response.Content as System.Net.Http.StreamContent).ReadAsStreamAsync().Result;
                            context.Response.Headers.Add("Content-Type", "application/soap+xml");
                            stream.CopyTo(context.Response.OutputStream);
                        }
                        context.Response.Close();
    
                        Console.ResetColor();
                        Console.WriteLine("CLOSE");
                    }
                }
                catch (Exception ex)
                {
                    Console.ForegroundColor = ConsoleColor.Red;
                    Console.WriteLine(ex.Message);
                }
    
                Console.WriteLine("END");
                Console.ReadKey();
            }
        }
    }

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク S100TG_USER 2021年3月9日 4:56
    2021年3月7日 20:08
  • ありがとうございます。無事「拡張機能と更新プログラム」が動くようになりました。
    ただ、動くようになった「拡張機能と更新プログラム」から更新しても、NuGETが動かないようですね。
    いろいろと調べた結果、プロジェクトルートの「.nuget」にあるnuget.exeをコマンドラインから操作すれば何とかなりそうですが……一応はまだサポート期間内なのですから、何とかしてほしいものです。
    ともあれまずは御礼を。わざわざソースコードまでご教示いただき、誠にありがとうございました。
    2021年3月9日 4:55