VSTO-специфичный веб-запрос не работает (System.Net.WebException) - PullRequest
0 голосов
/ 25 сентября 2018

Я написал приложение VSTO 2013/2016 для Microsoft Word, используя C #.Мое приложение создает новую панель инструментов с кнопками.Одна такая кнопка запускает мое приложение, которое запускает базовую форму Windows.

Прежде чем пользователь сможет работать с моим приложением, ему необходимо ввести информацию, такую ​​как код лицензии и адрес электронной почты.Мой код, в свою очередь, отправляет базовый запрос на мой сервер лицензирования и ожидает ответа.

Весь мой код работает нормально, и теперь его больше нет.Теперь, когда я запускаю код, я получаю два следующих сообщения об ошибке:

System.Net.WebException: «Базовое соединение было закрыто: при отправке произошла непредвиденная ошибка».Внутреннее исключение: IOException: невозможно прочитать данные из транспортного соединения: существующее соединение было принудительно закрыто удаленным хостом.

и

System.Net.WebException:«Базовое соединение было закрыто: при отправке произошла непредвиденная ошибка».Внутреннее исключение: SocketException: существующее соединение было принудительно закрыто удаленным хостом

Я решил запустить код с помощью стандартного консольного приложения, чтобы посмотреть, получило ли я то же сообщение об ошибке, и, конечно же, оноработал отлично!Теперь мне интересно, блокирует ли мое приложение Word или технология Microsoft VSTO доступ к моему серверу.

Вот код в VSTO, который не работает Примечание 1: Создан базовый 2013 /Надстройка 2016 C # VSTO, добавлена ​​панель инструментов и добавлено Примечание 2. Добавлена ​​ссылка на System.Web.Примечание 3: изменил ссылку на веб-сайт и строки запроса, так как я не хотел публиковать их на этом общедоступном форуме.

using System;
using Microsoft.Office.Tools.Ribbon;
using System.Web;
using System.Net;

namespace WordAddIn3
{
    public partial class Ribbon1
    {
        private void Ribbon1_Load(object sender, RibbonUIEventArgs e)
        {

        }

        private void button1_Click(object sender, RibbonControlEventArgs e)
        {
            // Attempt to activate the product using the licensing server on the website.
            Console.WriteLine("** ActivateLicense");

            //build the url to call the website's software licensing component.
            var builder = new UriBuilder("https://validwebsite.com");
            builder.Port = -1;
            //build the query string.
            var query = HttpUtility.ParseQueryString(builder.Query);
            query["license_key"] = "validactivationcdode";
            query["product_id"] = "validproductid";
            query["email"] = "validemailaddress";
            builder.Query = query.ToString();
            string url = builder.ToString();
            Console.WriteLine("activation request:");
            Console.WriteLine(url); //display the REST endpoint.

            //make the synchronous call to the web service.
            var syncClient = new WebClient();
            var responseStream = syncClient.DownloadString(url);
            Console.WriteLine("Response stream:");
            Console.WriteLine(responseStream); //display the server json response.
        }
    }
}

Вот что в точности совпадает с точным кодом в консольном приложении, который работает Примечание 1: Создано базовое консольное приложение C #.Примечание 2: добавлена ​​ссылка на System.Web.Примечание 3: изменил ссылку на сайт и строки запроса, так как я не хотел публиковать их на этом общедоступном форуме.Вы получите сообщение об ошибке, но это происходит из-за того, что на образце веб-сайта нет сервера лицензирования.

using System;
using System.Net;
using System.Web;
namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Attempt to activate the product using the licensing server on the website.
            Console.WriteLine("** ActivateLicense");

            //build the url to call the website's software licensing component.
            var builder = new UriBuilder("https://validwebsite.com");
            builder.Port = -1;
            //build the query string.
            var query = HttpUtility.ParseQueryString(builder.Query);
            query["license_key"] = "validactivationcdode";
            query["product_id"] = "validproductid";
            query["email"] = "validemailaddress";
            builder.Query = query.ToString();
            string url = builder.ToString();
            Console.WriteLine("activation request:");
            Console.WriteLine(url); //display the REST endpoint.

            //make the synchronous call to the web service.
            var syncClient = new WebClient();
            var responseStream = syncClient.DownloadString(url);
            Console.WriteLine("Response stream:");
            Console.WriteLine(responseStream); //display the server json response.
            Console.ReadKey();
        }
    }
}

Можете ли вы помочь мне определить, почему код больше не работает в надстройке, как раньше(без изменений кода)?

Я много читаю онлайн, и, похоже, слишком много причин, по которым это может произойти.Как FYI, веб-сайт с сервером лицензирования работает.Это (и всегда было) немного медленно, но при запуске кода с VSTO, ответ является немедленным (не предполагающим тайм-аут).Код консоли запускается, и время ожидания никогда не истекает. Я всегда получаю ответ от сервера лицензирования.

В другом потоке по аналогичной проблеме кто-то рекомендовал запустить WireShark.Я не очень знаком с продуктом, но во время моей рабочей консоли я не получал сообщений об ошибках, а вместо этого получал такие сообщения:

Standard query 0x626a AAAA mywebsite.com

и

Standard query response 0x626a AAAA mywebsite.com

Однако, если я запускаю тот же код в VSTO, я получаю дополнительные сообщения, которые являются ошибками (это появляется дважды):

TCP 60  443 → 50308 [RST, ACK] Seq=1 Ack=125 Win=32768 Len=0
...