VSTO特定的Web请求不起作用(System.Net.WebException)

时间:2018-09-25 01:20:15

标签: vsto system.net.webexception

我使用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

0 个答案:

没有答案