我使用C#为Microsoft Word编写了2013/2016 VSTO应用程序。我的应用程序创建了一个带有按钮的新工具栏。这样的按钮将运行我的应用程序,该应用程序将启动基本的Windows窗体。
在用户可以使用我的应用之前,他们需要输入信息,例如许可证代码和电子邮件地址。我的代码又将一个基本请求发送到我的许可服务器,并等待响应。
我所有的代码都运行良好,现在不再运行了。现在,当我运行代码时,我收到以下两条错误消息:
System.Net.WebException:'基础连接已关闭:An 发送时发生意外错误。”内部异常:IOException: 无法从传输连接中读取数据:现有 连接被远程主机强行关闭。
和
System.Net.WebException:'基础连接已关闭:An 发送时发生意外错误。”内部异常: 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();
}
}
}
您能帮我确定为什么该代码无法在加载项中像以前一样工作(没有代码更改)的原因吗?
我在网上读了很多书,似乎有太多原因导致这种情况发生。仅供参考,带有许可服务器的网站正在运行。这有点慢(并且一直很慢),但是当使用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