WCF-Problembehandlung aus ASP.NET Client — Hilfe!!!
Ich versuche eine Methode aufzurufen, die in meinem Dienst, wie unten, aus einer ASP.NET -Anwendung.
public bool ValidateUser(string username, string password)
{
try
{
//String CurrentLoggedInWindowsUserName = WindowsIdentity.GetCurrent().Name;
////primary identity of the call
//String CurrentServiceSecurityContextPrimaryIdentityName =
// ServiceSecurityContext.Current.PrimaryIdentity.Name;
//
}
catch (Exception ex)
{
FaultExceptionFactory fct = new FaultExceptionFactory();
throw new FaultException<CustomFaultException>(fct.CreateFaultException(ex));
}
return false;
}
Die Config für den client Ende meines Dienstes ist wie folgt
<binding name="WSHttpBinding_IMembershipService" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
bypassProxyOnLocal="false" transactionFlow="false"
hostNameComparisonMode="StrongWildcard"
maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text"
textEncoding="utf-8" useDefaultWebProxy="false" allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="false" />
<security mode="Message">
<transport clientCredentialType="Windows" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
algorithmSuite="Default" establishSecurityContext="true" />
</security>
</binding>
Problem, das ich behalten habe, ist, wenn ich es nennen; ich bekomme die folgende exception message.
Server Error in '/' Application.
The communication object, System.ServiceModel.Channels.ServiceChannel,
cannot be used for communication because it is in the Faulted state.
Description: An unhandled exception occurred during the execution of
the current web request. Please review the stack trace for more
information about the error and where it originated in the code.
Exception Details: System.ServiceModel.CommunicationObjectFaultedException:
The communication object, System.ServiceModel.Channels.ServiceChannel,
cannot be used for communication because it is in the Faulted state.
Stack Trace:
[CommunicationObjectFaultedException: The communication object,
System.ServiceModel.Channels.ServiceChannel, cannot be used for
communication because it is in the Faulted state.]
System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,
IMessage retMsg) +7596735
System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData,
Int32 type) +275
System.ServiceModel.ICommunicationObject.Close(TimeSpan timeout) +0
System.ServiceModel.ClientBase`1.System.ServiceModel.ICommunicationObject.
Close(TimeSpan timeout) +142
System.ServiceModel.ClientBase`1.Close() +38
System.ServiceModel.ClientBase`1.System.IDisposable.Dispose() +4
Controls.Membership.accountLogin.ValidateUserCredentials(String UserName,
String Password) in C:\ Petition.WebClient\Controls\
Membership\accountLogin.ascx.cs:49
Controls.Membership.accountLogin.Login1_Authenticate(Object sender,
AuthenticateEventArgs e) in C:\ WebClient\ Controls\Membership
\accountLogin.ascx.cs:55
Ich bin mir nicht ganz sicher, warum ich immer diese. Nur für den Fall, hier ist, wie nenne ich meinen Dienst vom client
private bool ValidateUserCredentials(string UserName, string Password)
{
bool boolReturnValue = false;
using(Members.MembershipServiceClient client =
new Controls.Members.MembershipServiceClient())
{
try
{
boolReturnValue = client.ValidateUser(UserName, Password);
}
catch (FaultException<CustomFaultException> ex)
{
throw ex;
}
}
return boolReturnValue;
}
Jemand eine Idee, was ich tun müssen, in diesem Fall?
InformationsquelleAutor Kobojunkie | 2009-08-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
WCF-client-proxies einen der beiden Plätze .NET, wo Sie sollten nicht implementieren, die eine
using
- block, um eine Instanz einer Klasse, dieIDisposable
. Sehen Indisposable: WCF Gotcha #1.OBTW, loszuwerden, die try/catch-block, um Ihren Anruf in der client. Nicht fangen Sie eine Ausnahme, es sei denn, man "handle" es sich irgendwie, und warf es wieder nicht "handling".
InformationsquelleAutor John Saunders
Ich bin sicher, du bist wahrscheinlich bewusst, aber wenn nicht, WCF-tracing könnte sich als hilfreich erweisen in diesen Situationen.
Insbesondere in Szenarien, in denen code versendet wurde, ist in der Produktion, und ist nicht aktualisierbar ist, aber ein unerwarteter Fehler auf der server-Seite, z.B. eine, die Sie nicht im Vertrag angegeben.
Auch in der Lage, um die Nachricht anzuzeigen Nutzlasten von unschätzbarem Wert sein kann.
Um die Spuren, die wiederum auf WCF-tracing in der app.config oder gleichwertig.
Es ist davon abhängig, wo Sie denken, dass der Fehler wahrscheinlich aufgetreten (client oder server oder beide), wo Sie wahrscheinlich wollen, aktivieren Sie die Ablaufverfolgung.
Dann nutzen Sie den Service Trace Viewer-tool, öffnen Sie die XML-log-Dateien, die es produziert.
Auf meinem Rechner ist es in
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\bin\SvcTraceViewer.exe
, aber Ihre Lage wohl ein wenig anders.Sehen die Service Trace Viewer Seite auf der MSDN-Website für weitere Informationen.
InformationsquelleAutor Leon Breedt
Gut, mit Ihrer aktuellen client-setup, werden Sie erwartet, um zu verschlüsseln und signieren Sie Ihre Nachrichten und senden Sie entlang Ihrer Windows-Anmeldeinformationen als Identität.
Wenn der remote-server, die versucht, zu behandeln, dieser Wunsch ist NICHT auf dem gleichen LAN oder nicht haben Zugang zu den gleichen Active Directory zu überprüfen diese Benutzer-Anmeldeinformationen, erhalten Sie diese Nachricht.
Den Sicherheitseinstellungen auf dem server und dem client übereinstimmen - z.B. wenn Ihr server hat so etwas wie
dann müssen Sie die gleichen Einstellungen auf dem client als auch. Wenn Ihr server kann nicht überprüfen, die Windows-Anmeldeinformationen, dann verwenden Sie Sie nicht. Verwenden Sie entweder keine Sicherheit (nicht ratsam! außer für Entwicklung/Test), oder den anonymen Anrufer (aber noch verwenden, z.B. die message-Sicherheit), oder dann haben Sie, um eine benutzerdefinierte Mechanismus, in dem der Aufrufer authentifizieren.
Sicherheit in WCF ist ein weites Feld 🙂 Hier einige links, die helfen könnten, in den Griff bekommen zu dem Thema:
und für eine wirklich vollständige, aber auch fast beängstigender überblick über alle Dinge, die die Sicherheit betreffen im WCF, es gibt die WCF-Sicherheit-Beratung auf CodePlex.
Hoffe, dies hilft Ihnen den Einstieg!
Marc
InformationsquelleAutor marc_s
Die Meldung : "CommunicationObjectFaultedException" in der Regel passiert, wenn Sie nicht anwenden, Entsorgen Sie die Kanäle, die das arbeiten mit using-block Verwenden, so müssen Sie nur fügen Sie eine Anweisung Abort so:
Ich hoffe das kann Dir helfen.
InformationsquelleAutor El_Sit