Я написал приложение 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