Ошибка аргумента когда обращаемся к своей DLL в кубике, почему?

  • Автор темы Автор темы selectel56
  • Дата начала Дата начала

selectel56

Client
Регистрация
11.12.2016
Сообщения
102
Реакции
54
Баллы
28
Друзья, создал свой вариант POST запроса в виде DLL, прикрутил ее, все работает когда вызываешь 3 аргумента, но когда все 6, то ругается.

Ошибка такая:
Тип Время Сообщение 03:31:32 Компиляция кода Ошибка в действии "CS1501" "No overload for method 'SendHttpRequest' takes 6 arguments". [Строка: 10; Cтолбец: 37]

Вот сам код запроса к DLL:
C#:
Развернуть Свернуть Копировать
            var HttpClient = new MyHttpClient();
            string h1 = "Authorization1: Bearer abc123\nAuthorization2: Bearer abc123";
            string h2 = "{\"param1\":\"value1\",\"param2\":\"value2\"}";
            string url = "https://vivazzi.pro/test-request/";
            string proxy = "127.0.0.1:8888";
            bool useProxy = true;
            string contentType = "application/json";

            var result = HttpClient.SendHttpRequest(h1, h2, url, proxy, useProxy, contentType);

           return result;
105790


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

Что делаю не так? В визуал студио все пашет хорошо.

DLL код:

C#:
Развернуть Свернуть Копировать
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Net;

namespace MyLibrary
{
    public class MyHttpClient
    {

        public string SendHttpRequest(string h1, string h2, string url, string proxy = null, bool useProxy = false, string contentType = "application/json")
        {

           
            var request = new HttpRequestMessage(HttpMethod.Post, url);
            var uri = request.RequestUri;
            var mySP = ServicePointManager.FindServicePoint(uri);
            mySP.Expect100Continue = false; // Удалить заголовок  expect: '100-continue'

            var headers = ParseHeaders(h1);
            foreach (var header in headers)
            {
                request.Headers.TryAddWithoutValidation(header.Key, header.Value);
            }
           


            request.Content = new StringContent(h2, Encoding.UTF8, contentType);

            var handler = new HttpClientHandler();
            handler.Proxy = new System.Net.WebProxy(proxy);
            handler.UseProxy = useProxy;
            var client = new HttpClient(handler);

            client.DefaultRequestHeaders.ExpectContinue = false;

            var response = client.SendAsync(request).Result;
            var result = response.Content.ReadAsStringAsync().Result;

            return result;
        }

        static Dictionary<string, string> ParseHeaders(string headerString)
        {
            var headers = new Dictionary<string, string>();
            var lines = headerString.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
            foreach (var line in lines)
            {
                var parts = line.Split(new[] { ':' }, 2);
                var key = parts[0].Trim();
                var value = parts[1].Trim();
                headers[key] = value;
            }
            return headers;
        }
    }
}
 

Вложения

Друзья, всем спасибо, доперло, не то делал: собрал DLL под Netstandart 2.0 / Потом добавил ссылку на Netstandart 2.0. и все взлетело!
 
Странно тогда, может версии у на зенки разные, хотя вроде у меня не такое старье.

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

Код дллшки:

C#:
Развернуть Свернуть Копировать
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Net;
using System.Linq;

namespace MyLibrary
{
    public class MyHttpClient
    {
        public string SendHttpRequest(string h1, string h2, string url, string proxy = null, bool useProxy = false, string contentType = "application/json")
        {
            var request = new HttpRequestMessage(HttpMethod.Post, url);
            var uri = request.RequestUri;
            var mySP = ServicePointManager.FindServicePoint(uri);
            mySP.Expect100Continue = false; // Удалить заголовок  expect: '100-continue'

            var headers = ParseHeaders(h1);
            foreach (var header in headers)
            {
                request.Headers.TryAddWithoutValidation(header.Key, header.Value);
            }

            request.Content = new StringContent(h2, Encoding.UTF8, contentType);

            var handler = new HttpClientHandler();
            handler.Proxy = new System.Net.WebProxy(proxy);
            handler.UseProxy = useProxy;
            var client = new HttpClient(handler);

            client.DefaultRequestHeaders.ExpectContinue = false;

            var response = client.SendAsync(request).Result;
            var headersString = string.Join(Environment.NewLine, response.Headers.Select(h => $"{h.Key}: {string.Join(", ", h.Value)}"));
            var contentString = response.Content.ReadAsStringAsync().Result;

            return $"{headersString}{Environment.NewLine}{Environment.NewLine}{contentString}";
        }

        static Dictionary<string, string> ParseHeaders(string headerString)
        {
            var headers = new Dictionary<string, string>();
            var lines = headerString.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
            foreach (var line in lines)
            {
                var parts = line.Split(new[] { ':' }, 2);
                var key = parts[0].Trim();
                var value = parts[1].Trim();
                headers[key] = value;
            }
            return headers;
        }
    }
}

Запрос делаю такой (DLL сразу в однйо переменной выдает результат полного овтета сервака):

var myHttpClient = new MyHttpClient(); var headers = "Content-Type: application/json\nAuthorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l"; // пример заголовков var body = "{\"name\": \"John\", \"age\": 30}"; // пример тела запроса var url = "https://mail.ru"; // пример URL-адреса string proxy = "127.0.0.1:8888"; bool useProxy = true; string contentType = "application/json"; var response = myHttpClient.SendHttpRequest(headers, body, url); using (StreamWriter writer = new StreamWriter(@"d:\1.txt")) { writer.Write(response); }

Для чистоты эксперимента результат ложу в d:\1.txt
Точно этот же код выдает в визуале - в заголовками
Тут в зенке - только тело.

Друзья, у меня скоро крыша поедит в чем такие приколы не понимаю.
 

Вложения

Не смог победить dll, не понял в чем причина, но переписал код напрямую, работает. Если кому то надо будет Post запрос там где не пашет стандартный от зенки то вот решение:

C#:
Развернуть Свернуть Копировать
var h1 = "Content-Type: application/json\nAuthorization: Basic QWxhZGRpbjpPcGVuU2VzYW1l";
var h2 = "{}";
var url = "https://mail.ru";
string proxy = "127.0.0.1:8888";
bool useProxy = false;
string contentType = "application/json";
            
var request = new HttpRequestMessage(HttpMethod.Post, url);
            
var uri = request.RequestUri;
var mySP = ServicePointManager.FindServicePoint(uri);
mySP.Expect100Continue = false;

var headers = ParseHeaders(h1);
foreach (var header in headers)
{
    var key = header.Key;
    var value = header.Value;
    request.Headers.TryAddWithoutValidation(key, value);
}


request.Content = new StringContent(h2, Encoding.UTF8, contentType);

var handler = new HttpClientHandler();
handler.Proxy = new System.Net.WebProxy(proxy);
handler.UseProxy = useProxy;
var client = new HttpClient(handler);

client.DefaultRequestHeaders.ExpectContinue = false;

var response = client.SendAsync(request).Result;
string headersString = response.Headers.ToString();
var contentString = response.Content.ReadAsStringAsync().Result;
//Console.WriteLine($"{headersString}\n\n{contentString}");
string output = $"{headersString}\n\n{contentString}";
//File.WriteAllText(@"d:/1.txt", output);
return output;
 Dictionary<string, string> ParseHeaders(string headerString)
{
    var headers2 = new Dictionary<string, string>();
    var lines = headerString.Split(new[] { '\n' }, StringSplitOptions.RemoveEmptyEntries);
    for (int i = 0; i < lines.Length; i++)
    {
        var parts = lines[i].Split(new[] { ':' }, 2);
        var key = parts[0].Trim();
        var value = parts[1].Trim();
        headers2[key] = value;
    }
    return headers2;
};
Код работает прекрасно через прокси и не передает паразитные заголовки типа Expect100Continue (с этим весь вечер бадался не мог понять че это за чудо). Ответ приходит в перменную заголовки/тело.

В using надо:

C#:
Развернуть Свернуть Копировать
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Net.Http;
using System.IO;
Тут много не нужных, запихал как есть проверять не буду, если кому надо лишние удалите.
В Gac ссылки обязательны на NetStandart 2.0.dll и System.Net.Http.dll - без них код не пашет.

Всем спасибо за проявленный интерес, если кто сможет решить вопрос по DLL что выше писал - буду признателен.
 
Зачем мне exe, не понимаю. Мне нужно чтобы DLL работала в проекте.
В Gac ссылки обязательны на NetStandart 2.0.dll и System.Net.Http.dll - без них код не пашет.
Тогда ожидайте в будущем вероятных конфликтов с постером из-за более новых версий dll (если они, конечно, будут).
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)