Ich habe eine E-Commerce-ASP.NET (C# Code hinter) Web-Anwendung geerbt. Wir sind kürzlich Server umgezogen und es erweist sich als etwas problematisch. Ich habe sehr wenig Erfahrung mit IIS-Server-Konfiguration und Umgang mit großen Projekten wie diesem. Die meisten Probleme sind jetzt behoben, aber wir haben Probleme mit einem entscheidenden Teil, da ein Kunde versucht, eine Zahlung zu leisten.
Da der Kunde die Zahlung bestätigt, trifft die Anwendung die folgende Fehlermeldung:Serialisierung Ausnahme in kompilierte DLL
Unable to serialize the session state. In 'StateServer' and 'SQLServer' mode, ASP.NET
will serialize the session state objects, and as a result non-serializable objects or
MarshalByRef objects are not permitted. The same restriction applies if similar
serialization is done by the custom session state store in 'Custom' mode.
Stack Trace:
[SerializationException: Type 'PayerAuthentication.PayerAuthenticationServicePost' in Assembly 'PayerAuthentication, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.]
System.Runtime.Serialization.FormatterServices.InternalGetSerializableMembers(RuntimeType type) +7733643
System.Runtime.Serialization.FormatterServices.GetSerializableMembers(Type type, StreamingContext context) +258
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitMemberInfo() +111
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.InitSerialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter) +161
System.Runtime.Serialization.Formatters.Binary.WriteObjectInfo.Serialize(Object obj, ISurrogateSelector surrogateSelector, StreamingContext context, SerObjectInfoInit serObjectInfoInit, IFormatterConverter converter, ObjectWriter objectWriter) +51
System.Runtime.Serialization.Formatters.Binary.ObjectWriter.Serialize(Object graph, Header[] inHeaders, __BinaryWriter serWriter, Boolean fCheck) +410
System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize(Stream serializationStream, Object graph, Header[] headers, Boolean fCheck) +134
System.Web.Util.AltSerialization.WriteValueToStream(Object value, BinaryWriter writer) +1577
Google-Suchergebnisse anzuzeigen, ich [Serializable]
zu der Klassendeklaration betroffen hinzufügen sollte, aber dies ist in eine kompilierte DLL, zu der ich kein csproj habe. Der Code funktionierte auf dem vorherigen Server einwandfrei, und ich glaube nicht, dass Änderungen am Code vorgenommen wurden, nur an web.config - was kann ich tun?
Der session Abschnitt von web.config liest <sessionState mode="StateServer" />
UPDATE1: Mit Reflektor, ich die Klasse oben ausgeführt, machte es serializable, neu kompiliert und ersetzt die DLL. Der Bestellvorgang ging einen Schritt weiter, woraufhin ich für eine andere dll-kompilierte Klasse den gleichen Fehler fand. Wieder einmal konnte ich Reflector verwenden, um den Code zu sehen und ihn dann zu exportieren, zu bearbeiten und neu zu kompilieren.
Jetzt habe ich die gleichen Fehler auftreten, in:
SerializationException: Type 'System.Runtime.Remoting.Messaging.AsyncResult' in Assembly 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' is not marked as serializable.]
Ich bin nicht sicher, ob ich etwas dagegen tun kann, da dieser Teil der .net-Systemdateien sein muss! Irgendwelche weiteren Ideen?
UPDATE2: Ha, auch ich habe später entdeckt es die Verarbeitung der Zahlungen korrekt, aber dann auf System.Runtime.Remoting.Messaging.AsyncResult
die oben Unable to serialize the session state
Fehler zu werfen, bevor der Benutzer Erhalt der Transaktion erhält. Nicht gut. Nicht sicher, wie vorwärts jetzt bewegen ...
UPDATE3: Ich habe versucht, eine Kopie der System.Runtime.Remoting.Messaging.AsyncResult
Klasse erstellen, und es serializable machen, aber das wird dann zu einem uneinheitlichen Zugangsproblemen führen.
using System;
using System.Runtime.InteropServices;
using System.Threading;
using System.Security.Permissions;
using System.Runtime.Remoting.Messaging;
[Serializable, ComVisible(true)]
public class myAsyncResult : IAsyncResult, IMessageSink
{
// Fields
private AsyncCallback _acbd;
private Delegate _asyncDelegate;
private object _asyncState;
private ManualResetEvent _AsyncWaitHandle;
private bool _endInvokeCalled;
private bool _isCompleted;
private IMessageCtrl _mc;
private IMessage _replyMsg;
// Methods
internal myAsyncResult(Message m);
//[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]
public virtual IMessageCtrl AsyncProcessMessage(IMessage msg, IMessageSink replySink);
private void FaultInWaitHandle();
public virtual IMessage GetReplyMessage();
public virtual void SetMessageCtrl(IMessageCtrl mc);
//[SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)]
public virtual IMessage SyncProcessMessage(IMessage msg);
// Properties
public virtual object AsyncDelegate { get; }
public virtual object AsyncState { get; }
public virtual WaitHandle AsyncWaitHandle { get; }
public virtual bool CompletedSynchronously { get; }
public bool EndInvokeCalled { get; set; }
public virtual bool IsCompleted { get; }
public IMessageSink NextSink { [SecurityPermission(SecurityAction.LinkDemand, Flags = SecurityPermissionFlag.Infrastructure)] get; }
}
Insbesondere dass error CS0122: 'System.Runtime.Remoting.Messaging.Message' is inaccessible due to its protection level
. Ich kann sehen, das ist, weil Nachricht eine interne Klasse ist. Aber ich kann die Barrierefreiheitsebene nicht ändern, da sie Teil des Namespaces System.Runtime ist. Und eine Kopie zu machen und sie umzubenennen, wird das gleiche Problem noch einmal verursachen.
Kann mir jetzt jemand helfen?
FINAL UPDATE Sieht aus wie, nach all dem, dass es das SSL-Zertifikat (siehe meine Antwort unten) war
Wie sieht der
bperreault