Ich versuche, einen WCT-REST-Service verfügbar zu machen und nur Benutzer mit einem gültigen Benutzernamen und Passwort können darauf zugreifen. Der Benutzername und das Passwort werden in einer SQL-Datenbank gespeichert. HierWie übergeben Sie Benutzeranmeldeinformationen vom WebClient an einen WCF-REST-Service?
ist der Servicevertrag:
public interface IDataService
{
[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
byte[] GetData(double startTime, double endTime);
}
Hier ist die WCF-Konfiguration:
<bindings>
<webHttpBinding>
<binding name="SecureBinding">
<security mode="Transport">
<transport clientCredentialType="Basic"/>
</security>
</binding>
</webHttpBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="DataServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
<serviceCredentials>
<userNameAuthentication
userNamePasswordValidationMode="Custom"
customUserNamePasswordValidatorType=
"CustomValidator, WCFHost" />
</serviceCredentials>
</behavior>
</serviceBehaviors>
</behaviors>
<services>
<service behaviorConfiguration="DataServiceBehavior" name="DataService">
<endpoint address="" binding="webHttpBinding"
bindingConfiguration="SecureBinding" contract="IDataService" />
</service>
</services>
ich den Dienst über die WebClient-Klasse innerhalb einer Silverlight-Anwendung zugreifen. Ich bin jedoch nicht in der Lage, herauszufinden, wie die Benutzeranmeldeinformationen an den Dienst übergeben werden. Ich habe verschiedene Werte für client.Credentials ausprobiert, aber keiner von ihnen scheint den Code in meinem benutzerdefinierten Validator auszulösen. Ich erhalte den folgenden Fehler: Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten.
Hier ist ein Beispielcode habe ich versucht:
WebClient client = new WebClient();
client.Credentials = new NetworkCredential("name", "password", "domain");
client.OpenReadCompleted += new OpenReadCompletedEventHandler(GetData);
client.OpenReadAsync(new Uri(uriString));
Wenn ich den Sicherheitsmodus auf Keine setzen, das Ganze funktioniert. Ich habe auch andere clientCredentialType-Werte ausprobiert und keiner von ihnen hat funktioniert. Ich habe auch den WCF-Dienst selbst gehostet, um die Probleme im Zusammenhang mit IIS zu lösen, die versuchen, einen Benutzer zu authentifizieren, bevor der Dienst eine Chance erhält.
Jeder Kommentar zu den zugrunde liegenden Problemen wäre sehr willkommen. Vielen Dank.
Aktualisieren: Dank Mehmet ausgezeichnete Vorschläge. Hier ist die Tracing-Konfiguration, die ich hatte:
Aber ich habe keine Nachricht von meinem Silverlight-Client kommen. Wie für https vs http, habe ich https wie folgt verwendet:
string baseAddress = "https://localhost:6600/";
_webServiceHost = new WebServiceHost(typeof(DataServices),
new Uri(baseAddress));
_webServiceHost.Open();
Allerdings habe ich kein SSL-Zertifikat konfiguriert. Ist das das Problem?
Alex, Sie müssen Ihren Dienst für die Verwendung eines sicheren Transportkanals (https) konfigurieren. Die Bindungen auf Client und Server sollten übereinstimmen. Wenn Sie Ihren Service auf IIS hosten, müssen Sie auch SSL für Ihre Site konfigurieren. Möglicherweise müssen Sie auch die Ausführlichkeit in Ihrer Ablaufverfolgung erhöhen, um weitere Details zu erhalten. Sehen Sie sich die Optionen an. Der Dienstkonfigurationseditor erleichtert das Bearbeiten von WCF-Einstellungen. –
Mehmet, danke. Ich habe meinen Dienst "konfiguriert", um https innerhalb des Basisadressen-URI zu verwenden. Für die WebClient-Instanz habe ich dieselbe Adresse mit "https" angegeben (d. H. Https: // localhost: 6600). Sind diese falsch? Wie würdest du sie sonst konfigurieren? Was das Tracing betrifft, habe ich es auf Verbose gesetzt, was alles protokollieren soll. Es hat mehr Sachen protokolliert, aber ich habe nichts vom Silverlight Client gesehen. Vielen Dank. –
Wie wird WCF auf der Client-Seite speziell für die Bindungen konfiguriert? Haben Sie IIS und Ihren Service für SSL konfiguriert? –