Laden...

[gelöst] POST-Request Listener - HttpContext.Current ist null

Erstellt von kunsti vor 8 Jahren Letzter Beitrag vor 8 Jahren 1.620 Views
K
kunsti Themenstarter:in
89 Beiträge seit 2013
vor 8 Jahren
[gelöst] POST-Request Listener - HttpContext.Current ist null

Hi,
ich habe eine Service geschrieben, der Post-Nachrichten loggt, die er als POST-Request erhält.
Zunächst wurde das ganze für HTTP erstellt. Das hatte auch ohne Probleme funktioniert.
Nun sollte das ganze auf HTTPS umgestellt werden, was zum Teil auch funktioniert.
Die Request wird erhalten und der body kann ausgelesen werden. Allerdings ist HttpContext.Current null.
Zuerst hatte ich gedacht, dass es daran liegt, dass es eine HTTPS-POST-Request ist. Alerddings existieren im Web einige Beispiele bei denen HttpContext.Current ebenfalls für HTTPS verwendet wird.
Nun habe ich leider keinen Ansatz mehr, woran es liegen könnte. Liegt es an der .config oder eventuell an den Einstellungen von IIS?
An den IIS Einstellungen hatte ich kaum was geändert. Ich hatte ein Zertifikat erstellt und eine Bindung für HTTPS hinzugefügt.
Web.config sieht wie folgt aus:


<system.web>
    <compilation debug="true" targetFramework="4.5" />	
  </system.web>
  <system.serviceModel>  
    <behaviors>
      <serviceBehaviors>
        <behavior name="svcBehavior">        
          <serviceMetadata httpGetEnabled="false" httpsGetEnabled="true"/>         
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
	  <endpointBehaviors>
				<behavior name="Web">
					<webHttp automaticFormatSelectionEnabled="True" defaultOutgoingResponseFormat="Json" />
				</behavior>
			</endpointBehaviors>
    </behaviors>
    <bindings>
      <webHttpBinding>
        <binding>
          <security mode="Transport"/>
        </binding>
      </webHttpBinding>
    </bindings>
    <services>
      <service name="Service" behaviorConfiguration="svcBehavior">
        <endpoint name="" binding="webHttpBinding" contract="IService" behaviorConfiguration="Web" />        
      </service>
    </services>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
	<directoryBrowse enabled="true"/>
  </system.webServer>

Und hier noch die Methode, die bei einer POST-Request ausgeführt wird:


public void ListenToPOSTRequests( Stream data )
	{
		try
		{
			Log.GetLogger.Info( "Data received" );
			Log.GetLogger.Info( HttpContext.Current == null );
			HttpRequest request =    HttpContext.Current.Request;
			Log.GetLogger.Info( "Start Logging Data" );
			LogRequest( request, data );
		}
		catch( Exception e )
		{
			Log.GetLogger.Error( e.ToString() );
		}
	}

Danke schon mal

16.834 Beiträge seit 2008
vor 8 Jahren

Wo liegt diese Methode und welche Art von Webanwendung machst Du überhaupt? API? MVC? WebForms?
Du kannst nicht von überall auf den aktuellen Kontext zugreifen; und da Web-Anwendungen immer Multi-Threaded sind gibt es auch mehrere (pro Request einen).

K
kunsti Themenstarter:in
89 Beiträge seit 2013
vor 8 Jahren

Hi,
danke schon mal für deine Antwort.

Ich habe einen WCVService erstellt.


[ServiceContract]
public interface IService
{
	[OperationContract]
	[WebInvoke (Method="POST")]	
	void ListenToPOSTRequests(Stream data);	
}

Die Klasse Service erbt von IService. Dort wird die Methode bereitgestellt.
Was mich gewundert hatte, war dass es mit HTTP-Request funktioniert hatte.
Gibt es eine alternative Möglichkeit, wenn ich nicht auf den aktuellen Kontext zugreifen kann?

16.834 Beiträge seit 2008
vor 8 Jahren

Also reden wir von WCF (damit wäre der Forenbereich auch der falsche; ich habs mal verschoben).
Dort musst Du die AspNetCompatibilityEnabled setzen (zB über die WebConfig oder als Attribut der Service-Klasse [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]), sonst kennt WCF das nicht.

K
kunsti Themenstarter:in
89 Beiträge seit 2013
vor 8 Jahren

Oh, dachte es würde hier rein passen, weil es ja auch was mit POST und HTTP zu tun hat.
Danke. Nun funktioniert.
Als Information für die jenigen die bei ihrere Suche auf den Thread stoßen:
Auch wenn AspNetCompatibilityEnabled in der Web.config auf true geetzt wird, mus dennoch das dennoch [AspNetCompatibilityRequirements( RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed )] für die Serviceklasse gesetzt werden.