Не удается закрыть поток, пока не будут записаны все байты - PullRequest
1 голос
/ 29 мая 2019

Это моя первая попытка в c # за последнее время, но я дошел до этого момента и, возможно, думаю, что мне нужны некоторые экспертные глаза на это.

Я продолжаю получать ошибку, упомянутую в названии. Я предполагаю, что есть что-то очевидное, что мне не хватает?

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace API_Call
{
    class Program
    {
        static void Main(string[] args)
        {
            var watch = new Stopwatch();
            HttpWebRequest request = HttpWebRequest.Create("http://bk-pim/Perfion/GetData.asmx") as HttpWebRequest;
            request.Method = "POST";
            request.ContentType = "text/xml";
            request.Headers.Add("SOAPAction","http://perfion.com/ExecuteQuery");
            //FileInfo info = new FileInfo(@"C:\Users\dcoats\Desktop\mytestfile.txt");
            //long size = info.Length;
            //request.ContentLength = size;


            using (var stream = request.GetRequestStream())
            using (var writer = new StreamWriter(stream))
            {
                var body = WebUtility.HtmlEncode(File.ReadAllText(@"C:\Users\dcoats\Desktop\mytestfile.txt"));
                body = "<?xml version=\"1.0\" encoding=\"utf - 8\"?>< soap:Envelope xmlns:soap = \"http://schemas.xmlsoap.org/soap/envelope/\" xmlns: xsi = \"http://www.w3.org/2001/XMLSchema-instance\" xmlns: xsd = \"http://www.w3.org/2001/XMLSchema\" >< soap:Body >< ExecuteQueryResponse xmlns = \"http://perfion.com/\" >< ExecuteQueryResult >" + body + "</ExecuteQueryResult></ ExecuteQueryResponse ></ soap:Body ></ soap:Envelope > ";

            }


            watch.Start();
            var response = request.GetResponse(); //bombs here
            watch.Stop();
            response.GetResponseStream();

            Console.WriteLine();
            Console.ReadLine();
            Console.WriteLine(watch.ElapsedMilliseconds);
            Console.ReadLine();
        }
    }
}

1 Ответ

1 голос
/ 29 мая 2019

Вы запросили лучший способ взаимодействия с веб-сервисом:

  • Щелкните правой кнопкой мыши ССЫЛКИ в SOLUTION EXPLORER
  • Выберите ДОБАВИТЬ ОБСЛУЖИВАНИЕ, ССЫЛКА
  • Введите URL-адрес, по которому находится ваша служба - например, http://bk -pim / Perfion / GetData.asmx или http://www.dneonline.com/calculator.asmx
  • Выберите пространство имен / установите другие параметры
  • Нажмите ОК
  • Создание клиента (я не смог использовать ваш веб-сервис, поэтому этот ответ теперь переключается на калькулятор DNEOnline с выбранным пространством имен «Calc»):

Calc.CalculatorSoapClient sc = new Calc.CalculatorSoapClient();

  • Вызов методов на клиенте:

int result = sc.Add(1,2);

Вот и все - без сокетов, без построения XML и т. Д. - ссылка на службу создает набор объектов и классов, которые делают все это

...