Ошибка 502 (Недопустимый шлюз) при отправлении запроса с HttpWebRequest по SSL

У меня есть следующий отрывок в классическом ASP, чтобы отправить команду и получить ответ по SSL:

Dim xmlHTTP
Set xmlHTTP = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0")
xmlHTTP.open "POST", "https://www.example.com", False
xmlHTTP.setRequestHeader "Content-Type","application/x-www-form-urlencoded"
xmlHTTP.setRequestHeader "Content-Length", Len(postData)
xmlHTTP.Send postData
If xmlHTTP.status = 200 And Len(message) > 0 And Not Err Then
   Print xmlHTTP.responseText
End If

Затем я использовал этот код как ссылку для перереализации запроса в c#:

private static string SendRequest(string url, string postdata)
{
   WebRequest rqst = HttpWebRequest.Create(url);
   // We have a proxy on the domain, so authentication is required.
   WebProxy proxy = new WebProxy("myproxy.mydomain.com", 8080);
   proxy.Credentials = new NetworkCredential("username", "password", "mydomain");
   rqst.Proxy = proxy;
   rqst.Method = "POST";
   if (!String.IsNullOrEmpty(postdata))
   {
       rqst.ContentType = "application/x-www-form-urlencoded";

       byte[] byteData = Encoding.UTF8.GetBytes(postdata);
       rqst.ContentLength = byteData.Length;
       using (Stream postStream = rqst.GetRequestStream())
       {
           postStream.Write(byteData, 0, byteData.Length);
           postStream.Close();
       }
   }
   ((HttpWebRequest)rqst).KeepAlive = false;
   StreamReader rsps = new StreamReader(rqst.GetResponse().GetResponseStream());
   string strRsps = rsps.ReadToEnd();
   return strRsps;
}

Проблема при вызове GetRequestStream, я продолжаю получать WebException с сообщением "The remote server returned an error: (502) Bad Gateway."

Сначала я думал, что это имело отношение к проверке сертификата SSL. Таким образом, я добавил эту строку:

ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy();

Где

public class AcceptAllCertificatePolicy : ICertificatePolicy
{
    public bool CheckValidationResult(ServicePoint srvPoint, 
                                      System.Security.Cryptography.X509Certificate certificate,
                                      WebRequest request, 
                                      int certificateProblem)
    {
        return true;
    }
}

И я продолжаю получать те же 502 ошибки. Какие-либо идеи?

24
задан Community 23 May 2017 в 11:33
поделиться

3 ответа

Он находится в System.Linq

Edit:

Removed - Я не видел, чтобы он смотрел на Compact рамок. В документации не говорится ничего конкретного о компактной структуре (что означает, что она, вероятно, не включена, но это не является убедительным). Я оставлю это пока, чтобы помочь другим избежать моей ошибки.

-121--4481952-

Хорошо, я думаю, что я понял это:

  • С помощью IValureFormatter , вход в метод FormatValue () является фактическим значением. (Технически, это объект ResolityContext , который позволяет получить значение с помощью свойства SourceValue , но вы получаете идею).

  • При использовании StartResolver входным значением метода ResolureCore () является весь источник (а не только исходное значение).

Таким образом, если требуется выполнить какое-либо преобразование между исходным значением и целевым значением, то IValureFormatter будет работать только в том случае, если типом назначения является последовательность , а GroupResolver будет работать только в том случае, если ResolureCore() метод «знает», какое свойство использовать (что не будет в случае, если ваш распознаватель общего назначения, т.е. не применяется к конкретному свойству).

Обходной путь

К счастью, всегда существует MapFrom , что обеспечивает гибкость, которая отсутствует как у распознавателей, так и у форматтеров.

Конвертерный интерфейс

В итоге я написал интерфейс, чтобы просто и гибко обрабатывать то, что я считаю очень распространенным сценарием: двусторонние преобразования...

public interface ITwoWayConverter<TInput, TOutput>
{
    TOutput ConvertForward(TInput value);
    TInput ConvertBackward(TOutput value);
}

Пример конвертера:

public class PhoneNumberToString : ITwoWayConverter<long, string>
{
    public string ConvertForward(long value)
    {
        return string.Format("{0:(###) ###-####}", Convert.ToInt64(value));
    }

    public long ConvertBackward(string value)
    {
        return Convert.ToInt64(Regex.Replace(value, @"\D", string.Empty));
    }
}

Пример использования:

Mapper.CreateMap<User, UserViewModel>()
    .ForMember(dest => dest.PhoneNumber, opt => opt
        .MapFrom(orig => new PhoneNumberToString().ConvertForward(orig.PhoneNumber)));
-121--2410556-

С помощью этого я получил более подробное описание проблемы: прокси-сервер возвращал сообщение: « Агент пользователя не распознан ». Поэтому я установил его вручную. Кроме того, я изменил код, чтобы использовать StartProxySelection.GetEmpireWebProxy (), как описано здесь . Окончательный рабочий код приведен ниже.

private static string SendRequest(string url, string postdata)
{
    if (String.IsNullOrEmpty(postdata))
        return null;
    HttpWebRequest rqst = (HttpWebRequest)HttpWebRequest.Create(url);
    // No proxy details are required in the code.
    rqst.Proxy = GlobalProxySelection.GetEmptyWebProxy();
    rqst.Method = "POST";
    rqst.ContentType = "application/x-www-form-urlencoded";
    // In order to solve the problem with the proxy not recognising the user
    // agent, a default value is provided here.
    rqst.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)";
    byte[] byteData = Encoding.UTF8.GetBytes(postdata);
    rqst.ContentLength = byteData.Length;

    using (Stream postStream = rqst.GetRequestStream())
    {
        postStream.Write(byteData, 0, byteData.Length);
        postStream.Close();
    }
    StreamReader rsps = new StreamReader(rqst.GetResponse().GetResponseStream());
    string strRsps = rsps.ReadToEnd();
    return strRsps;
}
26
ответ дан 28 November 2019 в 22:44
поделиться

Возможно, что wsdl для веб-службы "спорит" с доменным именем и SSL-сертификатом. IIS автоматически сгенерирует WSDL веб-службы, используя зарегистрированное IIS доменное имя (которое по умолчанию является именем машины на локальном домене, не обязательно на вашем веб-домене). Если домен сертификата не соответствует домену в адресе SOAP12, вы получите ошибки связи.

1
ответ дан 28 November 2019 в 22:44
поделиться

Прочитать тело сообщения об ошибке. Это может быть намек на то, что происходит.

Код для этого выглядит следующим образом:

catch(WebException e)
{
if (e.Status == WebExceptionStatus.ProtocolError)
{
    WebResponse resp = e.Response;
    using(StreamReader sr = new StreamReader(resp.GetResponseStream()))
    {
         Response.Write(sr.ReadToEnd());
    }
}
}

Он должен показать полное содержание ответа об ошибке.

32
ответ дан 28 November 2019 в 22:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: