Wie? WCF customBinding über Https
Ich versuche zum einrichten einer WCF-Dienst für internen Gebrauch, auf unserer nach außen gerichteten web-farm (wir haben nicht eine web-farm intern, und ich brauche diesen service zu haben, failover und load-balancing).
Anforderungen:
- PerSession Zustand, als wir den Dienst benötigen, um retain-variable Daten für jede Sitzung.
- HTTPS. Nach viel googeln habe ich gelesen, ich brauchte, um zu erstellen ein customBinding, was ich getan habe, aber nicht sicher, ob es richtig ist.
- Nachrichtengröße, als einer der Parameter ist ein byte[] array, die ein Maximum von 5 MB.
- keine Notwendigkeit, manuell Bearbeiten der client-Seite der app.config. dh, ich muss die Entwickler einfach den Dienstverweis hinzufügen, und dann beginnt mit dem Objekt, ohne fummelig wechseln der app.config.
Hinweis: ich habe zuvor diesen Dienst funktioniert unter HTTP richtig (mit wsHttpBinding).
Ich habe auch hatte es unter HTTPS, aber es hat nicht unterstützen PerSession Zustand, und verlor interne variable Werte jeder Funktion.
Ich bin derzeit immer diese Fehler vom test harness:
Konnte nicht finden, Standard-endpoint-element, das Verweise Vertrag " AppMonitor.IAppMonitorWcfService " im ServiceModel-clientkonfigurationsabschnitt. Dies könnte daran liegen, dass keine Konfigurations-Datei gefunden wurde, für Ihre Anwendung, oder weil keine endpoint-element dazu passenden Vertrag gefunden werden konnte, der in der client-element.
HINWEIS: Der Fehler entsteht auf einer Testumgebung EXE, hat der WCF-service direkt verwiesen unter Service-Verweise. Das ist nicht das problem, eine exe verweisen auf ein anderes Objekt, das verweist dann auf der WCF-service, dass hab ich überlesen.
Die WSDL wird korrekt angezeigt, wenn der Browser die URL.
Web.Config:
<system.serviceModel>
<services>
<service name="AppMonitor.AppMonitorWcfService" behaviorConfiguration="ServiceBehavior">
<endpoint address="" binding="customBinding" bindingConfiguration="EnablePerSessionUnderHttps" contract="AppMonitor.IAppMonitorWcfService"/>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
<bindings>
<customBinding>
<binding name="EnablePerSessionUnderHttps" maxReceivedMessageSize="5242880">
<reliableSession ordered="true"/>
<textMessageEncoding>
<readerQuotas maxDepth="64" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="4096" maxNameTableCharCount="16384" />
</textMessageEncoding>
<httpsTransport authenticationScheme="Anonymous" requireClientCertificate="false"/>
</binding>
</customBinding>
</bindings>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpsGetEnabled="true" httpGetEnabled="false"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
EXE App.config (auto-erzeugt beim hinzufügen der Service Referenz):
<configuration>
<system.serviceModel>
<bindings>
<wsHttpBinding>
<binding name="CustomBinding_IAppMonitorWcfService" 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="true"
allowCookies="false">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<reliableSession ordered="true" inactivityTimeout="00:10:00"
enabled="true" />
<security mode="Transport">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="Windows" negotiateServiceCredential="true"
establishSecurityContext="true" />
</security>
</binding>
</wsHttpBinding>
</bindings>
<client />
</system.serviceModel>
</configuration>
Ich bin nicht sicher, warum die app.config zeigt wsHttpBinding? Sollte dies nicht sein customBinding?
Ich wirklich nicht wollen, Bearbeiten Sie die app.config, als dieser Dienst wird von Dutzenden von Entwicklern, und ich will, dass Sie nur in der Lage sein, um den Dienstverweis hinzufügen, und Weg Sie gehen...
Mit VS2008, .NET 3.51.
Ich denke, server IIS7, Windows Server 2008, kann das bestätigen, wenn nötig.
Du musst angemeldet sein, um einen Kommentar abzugeben.
OK, dein problem ist, dass Sie nicht definiert haben, ein Adresse für Ihren Dienst. Denken Sie daran ABC der endpoint: Adresse-Binding-Vertrag.
Müssen Sie definieren eine Adresse für den service-das ist ziemlich viel, unterliegt Ihr .svc-Datei und wo die Datei kann durchsucht werden, von Ihrer IIS. Was auch immer die URL, die .svc-Datei, Sie fügen die Adresse ein, die Sie definiert haben (in Ihrem Fall leerer string) und dann ist es auf die Oberseite Hinzugefügt. Also, wenn ich sage myservice.svc-Datei in den root, es wird
https://localhost/myservice.svc/<ServiceAddress>
In Ihrem Fall
ServiceAddress=""
so URL isthttps://localhost/myservice.svc/
.Sehen hier für mehr info.