2015-09-23 2 views
1

У меня есть две версии веб-формы. Оригинал, в VB. И новый, в C#. Оба они делают по существу одно и то же, но язык отличается, а версия C# немного улучшена по функциональности и удобна для чтения. Разница на самой странице .aspx для каждого из них отличается с помощью свойства autoeventwireup в теге @Page. Теперь, когда я пытаюсь запустить версию VB, я получаю результаты, которые я ищу. Версия C# ничего не делает. В журналах для каждой страницы я вижу, что версия VB получает POST от вызывающего, а версия C# получает GET от вызывающего. Таким образом, ни одно из значений Request.Form не доступно для версии C#. Обе страницы при развертывании вызываются отдельным веб-приложением.C# версия страницы WebForms не работает, версия VB -

VB Версия page.aspx:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Custom Label Generator.aspx.vb" Inherits="_Default" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml" > 
<head runat="server"> 
    <title>Untitled Page</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 

    </div> 
    </form> 
</body> 
</html> 

C# версия page.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Custom Label Generator.aspx.cs" Inherits="CustomLabelGenerator.Custom_Label_Generator" %> 

<!DOCTYPE html> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title>Custom Label Generator</title> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 

    </div> 
    </form> 
</body> 
</html> 

VB версии кода позади:

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 

    'LogEvent("Request to print: " & Date.Today) 

    Try 
     If Request.Form.Count <= 0 Then 
      LogEvent("No label data was submitted with the request.") 
      Exit Sub 
     End If 
     'WRITE LABEL DATA BACK TO REQUESTING CLIENT 
     Me.Response.Clear() 
     Me.Response.ContentType = "text/plain" 
     Me.Response.BinaryWrite(System.Text.Encoding.Default.GetBytes(sLabelCode)) 
     Me.Response.Flush() 

    Catch ex As Exception 
     LogEvent("Problem generating custom labels. More information: " + ex.Message) 
    End Try 
End Sub 

C# версии кода позади:

protected void Page_Load(object sender, EventArgs e) 
    { 
     LogHelper.LogEvent("Request to print at: " + DateTime.Now); 

     try 
     { 
      if(Request.Form.Count <= 0) 
      { 
       LogHelper.LogEvent("No label data was submitted with the request"); 
       return; 
      } 
      Response.Clear(); 
      Response.ContentType = "text/plain"; 
      Response.BinaryWrite(Encoding.Default.GetBytes(labelCode)); 
      Response.Flush(); 
     } 
     catch (Exception ex) 
     { 
      LogHelper.LogEvent("Problem generating custom labels. More information :: " + ex.Message); 
     } 
     finally 
     { 
      LogHelper.CleanupOldLogs(); 
     } 
    } 

В настоящее время у меня есть куча кода, чтобы выплюнуть всю информацию о запросе, о которой я могу думать. Я также пробовал отменять autoeventwireup, но, похоже, в C# не существует твердого эквивалента. Мне интересно, может быть, это будет лучше, чем вызов WebAPI, заставить его принимать POST, а не вмешиваться в какие-либо другие kruft. Я не уверен, что у меня есть время для такого уровня конверсии, поэтому решение на основе веб-форм будет оценено по достоинству!

Обновление: сброс Request.Form.Keys от версии VB (минус ПОЛЕЗНЫХ ключей мне нужно)

9/23/2015 2:25:10 PM,ALL_HTTP => HTTP_CONNECTION:Keep-Alive 
HTTP_CONTENT_LENGTH:1371 
HTTP_CONTENT_TYPE:application/x-www-form-urlencoded 
HTTP_EXPECT:100-continue 
HTTP_HOST:localhost 

9/23/2015 2:25:10 PM,ALL_RAW => Connection: Keep-Alive 
Content-Length: 1371 
Content-Type: application/x-www-form-urlencoded 
Expect: 100-continue 
Host: localhost 

9/23/2015 2:25:10 PM,APPL_MD_PATH => /LM/W3SVC/1/ROOT/Custom Label Generator 
9/23/2015 2:25:10 PM,APPL_PHYSICAL_PATH => C:\Program Files (x86)\AgileElite\Projects Server\ContentLabelGenerator\ 
9/23/2015 2:25:10 PM,AUTH_TYPE => 
9/23/2015 2:25:10 PM,AUTH_USER => 
9/23/2015 2:25:10 PM,AUTH_PASSWORD => 
9/23/2015 2:25:10 PM,LOGON_USER => 
9/23/2015 2:25:10 PM,REMOTE_USER => 
9/23/2015 2:25:10 PM,CERT_COOKIE => 
9/23/2015 2:25:10 PM,CERT_FLAGS => 
9/23/2015 2:25:10 PM,CERT_ISSUER => 
9/23/2015 2:25:10 PM,CERT_KEYSIZE => 
9/23/2015 2:25:10 PM,CERT_SECRETKEYSIZE => 
9/23/2015 2:25:10 PM,CERT_SERIALNUMBER => 
9/23/2015 2:25:10 PM,CERT_SERVER_ISSUER => 
9/23/2015 2:25:10 PM,CERT_SERVER_SUBJECT => 
9/23/2015 2:25:10 PM,CERT_SUBJECT => 
9/23/2015 2:25:10 PM,CONTENT_LENGTH => 1371 
9/23/2015 2:25:10 PM,CONTENT_TYPE => application/x-www-form-urlencoded 
9/23/2015 2:25:10 PM,GATEWAY_INTERFACE => CGI/1.1 
9/23/2015 2:25:10 PM,HTTPS => off 
9/23/2015 2:25:10 PM,HTTPS_KEYSIZE => 
9/23/2015 2:25:10 PM,HTTPS_SECRETKEYSIZE => 
9/23/2015 2:25:10 PM,HTTPS_SERVER_ISSUER => 
9/23/2015 2:25:10 PM,HTTPS_SERVER_SUBJECT => 
9/23/2015 2:25:10 PM,INSTANCE_ID => 1 
9/23/2015 2:25:10 PM,INSTANCE_META_PATH => /LM/W3SVC/1 
9/23/2015 2:25:10 PM,LOCAL_ADDR => ::1 
9/23/2015 2:25:10 PM,PATH_INFO => /Custom Label Generator/Custom Label Generator.aspx 
9/23/2015 2:25:10 PM,PATH_TRANSLATED => C:\Program Files (x86)\AgileElite\Projects Server\ContentLabelGenerator\Custom Label Generator.aspx 
9/23/2015 2:25:10 PM,QUERY_STRING => 
9/23/2015 2:25:10 PM,REMOTE_ADDR => ::1 
9/23/2015 2:25:10 PM,REMOTE_HOST => ::1 
9/23/2015 2:25:10 PM,REMOTE_PORT => 59112 
9/23/2015 2:25:10 PM,**REQUEST_METHOD => POST** 
9/23/2015 2:25:10 PM,SCRIPT_NAME => /Custom Label Generator/Custom Label Generator.aspx 
9/23/2015 2:25:10 PM,SERVER_NAME => localhost 
9/23/2015 2:25:10 PM,SERVER_PORT => 80 
9/23/2015 2:25:10 PM,SERVER_PORT_SECURE => 0 
9/23/2015 2:25:10 PM,SERVER_PROTOCOL => HTTP/1.1 
9/23/2015 2:25:10 PM,SERVER_SOFTWARE => Microsoft-IIS/7.5 
9/23/2015 2:25:10 PM,URL => /Custom Label Generator/Custom Label Generator.aspx 
9/23/2015 2:25:10 PM,HTTP_CONNECTION => Keep-Alive 
9/23/2015 2:25:10 PM,HTTP_CONTENT_LENGTH => 1371 
9/23/2015 2:25:10 PM,HTTP_CONTENT_TYPE => application/x-www-form-urlencoded 
9/23/2015 2:25:10 PM,HTTP_EXPECT => 100-continue 
9/23/2015 2:25:10 PM,HTTP_HOST => localhost 

C# версии отвала Request.Params.Keys (другие части заготовки)

9/23/2015 2:17:04 PM --- Request to print at: 9/23/2015 2:17:04 PM 
9/23/2015 2:17:04 PM --- Request.Params.Keys: 
9/23/2015 2:17:04 PM --- ALL_HTTP => HTTP_CONTENT_TYPE:application/x-www-form-urlencoded 
HTTP_HOST:localhost 

9/23/2015 2:17:04 PM --- ALL_RAW => Content-Type: application/x-www-form-urlencoded 
Host: localhost 

9/23/2015 2:17:04 PM --- APPL_MD_PATH => /LM/W3SVC/1/ROOT/Custom Label Generator 
9/23/2015 2:17:04 PM --- APPL_PHYSICAL_PATH => C:\Program Files (x86)\AgileElite\Projects Server\ContentLabelGenerator\ 
9/23/2015 2:17:04 PM --- AUTH_TYPE => 
9/23/2015 2:17:04 PM --- AUTH_USER => 
9/23/2015 2:17:04 PM --- AUTH_PASSWORD => 
9/23/2015 2:17:05 PM --- LOGON_USER => 
9/23/2015 2:17:05 PM --- REMOTE_USER => 
9/23/2015 2:17:05 PM --- CERT_COOKIE => 
9/23/2015 2:17:05 PM --- CERT_FLAGS => 
9/23/2015 2:17:05 PM --- CERT_ISSUER => 
9/23/2015 2:17:05 PM --- CERT_KEYSIZE => 
9/23/2015 2:17:05 PM --- CERT_SECRETKEYSIZE => 
9/23/2015 2:17:05 PM --- CERT_SERIALNUMBER => 
9/23/2015 2:17:05 PM --- CERT_SERVER_ISSUER => 
9/23/2015 2:17:05 PM --- CERT_SERVER_SUBJECT => 
9/23/2015 2:17:05 PM --- CERT_SUBJECT => 
9/23/2015 2:17:05 PM --- CONTENT_LENGTH => 0 
9/23/2015 2:17:05 PM --- CONTENT_TYPE => application/x-www-form-urlencoded 
9/23/2015 2:17:05 PM --- GATEWAY_INTERFACE => CGI/1.1 
9/23/2015 2:17:05 PM --- HTTPS => off 
9/23/2015 2:17:05 PM --- HTTPS_KEYSIZE => 
9/23/2015 2:17:05 PM --- HTTPS_SECRETKEYSIZE => 
9/23/2015 2:17:05 PM --- HTTPS_SERVER_ISSUER => 
9/23/2015 2:17:05 PM --- HTTPS_SERVER_SUBJECT => 
9/23/2015 2:17:05 PM --- INSTANCE_ID => 1 
9/23/2015 2:17:05 PM --- INSTANCE_META_PATH => /LM/W3SVC/1 
9/23/2015 2:17:05 PM --- LOCAL_ADDR => ::1 
9/23/2015 2:17:05 PM --- PATH_INFO => /Custom Label Generator/Custom Label Generator 
9/23/2015 2:17:05 PM --- PATH_TRANSLATED => C:\Program Files (x86)\AgileElite\Projects Server\ContentLabelGenerator\Custom Label Generator 
9/23/2015 2:17:05 PM --- QUERY_STRING => 
9/23/2015 2:17:05 PM --- REMOTE_ADDR => ::1 
9/23/2015 2:17:05 PM --- REMOTE_HOST => ::1 
9/23/2015 2:17:05 PM --- REMOTE_PORT => 58997 
9/23/2015 2:17:05 PM --- **REQUEST_METHOD => GET** 
9/23/2015 2:17:05 PM --- SCRIPT_NAME => /Custom Label Generator/Custom Label Generator 
9/23/2015 2:17:05 PM --- SERVER_NAME => localhost 
9/23/2015 2:17:05 PM --- SERVER_PORT => 80 
9/23/2015 2:17:05 PM --- SERVER_PORT_SECURE => 0 
9/23/2015 2:17:05 PM --- SERVER_PROTOCOL => HTTP/1.1 
9/23/2015 2:17:05 PM --- SERVER_SOFTWARE => Microsoft-IIS/7.5 
9/23/2015 2:17:05 PM --- URL => /Custom Label Generator/Custom Label Generator 
9/23/2015 2:17:05 PM --- HTTP_CONTENT_TYPE => application/x-www-form-urlencoded 
9/23/2015 2:17:05 PM --- HTTP_HOST => localhost 
9/23/2015 2:17:05 PM --- /****************** Request.Form.Keys: ***********************/ 
9/23/2015 2:17:05 PM --- /****************** Request.Form.AllKeys: ***********************/ 
9/23/2015 2:17:05 PM --- /****************** Request.QueryString.Keys: ***********************/ 
+0

было бы хорошо, если бы вы включили ошибку :) – Rex

+0

нет на самом деле ошибки. Он просто срывает все данные запроса. версия vb говорит, что это POST, а версия C# говорит о GET. Должен ли я это исправить? – Matt

ответ

5

Matt, я столкнулся с 'POST' таинственно изменения к 'GET' перед также. Вероятно, он перенаправляется из-за настроек FriendlyUrlSettings, которые по умолчанию установлены в VS2013 и выше.

Один из способов: перейдите в папку App_Start в RouteConfig.ResgisterRoutes и установить settings.AutoRedirectMode = RedirectMode.Off

public static class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     var settings = new FriendlyUrlSettings(); 
     settings.AutoRedirectMode = RedirectMode.Off; 
     routes.EnableFriendlyUrls(settings); 
    } 
} 

Checkout эту ссылку для получения дополнительной информации о FriendlyUrls: http://www.hanselman.com/blog/IntroducingASPNETFriendlyUrlsCleanerURLsEasierRoutingAndMobileViewsForASPNETWebForms.aspx

+0

это был трюк. Я попытался создать проект заново в VS 2012 и не имел никаких проблем, поэтому я вернулся и сделал это в решении VS 2013 года, и это, похоже, сделало трюк! – Matt

0

Мэтт Почему бы вам просто не положить метод = "POST" в вашу форму?

<form id="form1" runat="server" method="post"> 
+0

Я пробовал это, но, похоже, это не помогло. – Matt

+0

Даже если вы положили сообщение метода, он делает GET? – Luiz

+0

Да, см. Ответы Дерека и Джоброкола для объяснений, почему. – Matt

0

Мэтт,

Было ли это намеренно?

VB Inherits = "_ Default"

C# наследующий = "CustomLabelGenerator.Custom_Label_Generator»

+0

Да, кто писал VB-версию, я думаю, что просто переименовал некоторые вещи. Я создал новую страницу, но имена классов и файлов совпадают в версии C# – Matt

4

Matt,

Причиной такого поведения является попытка уменьшить шансы на нескольких форм представления Теория за это называется POST-Redirect-ГЭТ От https://en.wikipedia.org/wiki/Post/Redirect/Get:..

Когда веб-форма отправляется на сервер через HTTP-запрос POST, пользователь сети, который пытается обновить ответ сервера в определенных пользовательских агентах, может повторно отправить содержимое исходного HTTP-запроса POST, что может привести к нежелательным результатам, например в качестве дублированной покупки в сети.

Чтобы избежать этой проблемы, многие веб-разработчики используют шаблон PRG 1 - вместо того, чтобы возвращать веб-страницу напрямую, операция POST возвращает команду перенаправления. Спецификация HTTP 1.1 ввела HTTP-код HTTP 303 («Смотри другой»), чтобы гарантировать, что в этой ситуации браузер веб-пользователя может безопасно обновить ответ сервера, не вызывая повторного запроса первоначального запроса HTTP POST. Однако большинство распространенных коммерческих приложений, используемых сегодня (как новых, так и старых), по-прежнему продолжают выдавать ответы HTTP 302 («Найденные») в этих ситуациях.

Смежные вопросы