2009-06-13 13 views
1

Eine meiner Methoden gibt Byte [] einer Datei zurück. Alle anderen Methoden geben entweder String-Objekte oder benutzerdefinierte Objekte zurückFehler beim Versuch, WCF-Dienst zu verwenden, der Datei zurückgibt

Ich kann die WSDL über einen Browser anzeigen und wie ich WCFExtras verwendet habe, kann ich sogar die Dokumentation anzeigen.

In meiner Test-App, C# Web-Anwendung, füge ich den Verweis auf meine SVC, gehostet auf einem Test-Server. Ich erhalte eine Fehlermeldung als solche:

 The document was understood, but it could not be processed. 
    - The WSDL document contains links that could not be resolved. 
    - There was an error downloading ... 
    - Unable to connect to remote server 
    - No connection could be made because the target machine actively refused it 

    Content Type application/soap+xml; charset=utf-8 was not supported by service . The client and service bindings may be mismatched. 
    The remote server returned an error: (415) Cannot process the message because the content type 'application/soap+xml; charset=utf-8' was not the expected type 'text/xml; charset=utf-8'.. 
    If the service is defined in the current solution, try building the solution and adding the service reference again. 

Das ist mein app.config ist

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <connectionStrings> 
    <add name="TestApp.Properties.Settings.TestDBConnectionString" 
     connectionString="Data Source=192.168.2.130;Initial Catalog=TestDB;Persist Security Info=True;User ID=sa;Password=xerox" 
     providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
    <system.web> 
    <compilation debug="true" /> 
    </system.web> 
    <!-- When deploying the service library project, the content of the config file must be added to the host's 
    app.config file. System.Configuration does not support config files for libraries. --> 
    <system.serviceModel> 
    <services> 
     <service behaviorConfiguration="TestApp.Service1Behavior" 
     name="TestApp.SearchService"> 
     <endpoint address="" behaviorConfiguration="Sample.WsdlSampleEndpointBehavior" 
      binding="basicHttpBinding" bindingConfiguration="WsHttpMtomBinding" contract="TestApp.ISearchService"> 
      <identity> 
      <dns value="localhost" /> 
      </identity> 
     </endpoint> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> 
     <host> 
      <baseAddresses> 
      <add baseAddress="http://localhost:8731/TestApp/Service1/" /> 
      </baseAddresses> 
     </host> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
     <behavior name="Sample.WsdlSampleEndpointBehavior"> 
      <wsdlExtensions location="http://localhost:8731/TestApp/Service1/"/> 
     </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
     <behavior name="TestApp.Service1Behavior"> 
      <!-- To avoid disclosing metadata information, 
      set the value below to false and remove the metadata endpoint above before deployment --> 
      <serviceMetadata httpGetEnabled="True"/> 
      <!-- To receive exception details in faults for debugging purposes, 
      set the value below to true. Set to false before deployment 
      to avoid disclosing exception information --> 
      <serviceDebug includeExceptionDetailInFaults="true" /> 
     </behavior> 

     </serviceBehaviors> 
    </behaviors> 
    <extensions> 
     <behaviorExtensions> 
     <!-- Declare that we have an extension called WSDL Extras--> 
     <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
     </behaviorExtensions> 
    </extensions> 
    <bindings> 
     <basicHttpBinding> 
     <binding name="WsHttpMtomBinding" messageEncoding="Mtom" transferMode="StreamedResponse" /> 
     </basicHttpBinding> 
    </bindings> 
    </system.serviceModel> 
</configuration> 

Irgendwelche Ideen, wie ich dieses Problem lösen würde? Sollte ich zwei verschiedene Bindungen haben, eine für Methoden, die keine Bytes [] zurückgeben, und Mtom für die Methode, die Byte [] zurückgibt? Wenn ja, wie wendet man Bindungen pro exponierter Methode an?

Versuchte es mit WcfTestClient.exe laufen und das ist der Fehler

rror: Cannot import wsdl:portTypeDetail: An exception was thrown while running a WSDL import extension: System.ServiceModel.Description.DataContractSerializerMessageContractImporterError: Schema with target namespace 'http://tempuri.org/' could not be found.XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISearchService']Error: Cannot import wsdl:bindingDetail: There was an error importing a wsdl:portType that the wsdl:binding is dependent on.XPath to wsdl:portType: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:portType[@name='ISearchService']XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='BasicHttpBinding_ISearchService']Error: Cannot import wsdl:portDetail: There was an error importing a wsdl:binding that the wsdl:port is dependent on.XPath to wsdl:binding: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:binding[@name='BasicHttpBinding_ISearchService']XPath to Error Source: //wsdl:definitions[@targetNamespace='http://tempuri.org/']/wsdl:service[@name='SearchService']/wsdl:port[@name='BasicHttpBinding_ISearchService']Warning: No code was generated.If you were trying to generate a client, this could be because the metadata documents did not contain any valid contracts or servicesor because all contracts/services were discovered to exist in /reference assemblies. Verify that you passed all the metadata documents to the tool.Warning: If you would like to generate data contracts from schemas make sure to use the /dataContractOnly option. 

Antwort

0

Auf der Client-Anwendung, haben Sie einen Verweis auf die WCFExtras Baugruppe haben? Der Fehler scheint zu sagen, dass die Bindung nicht erkannt wird, was ich aufgrund der von WCFExtras eingeführten Erweiterungen vermute. Versuchen Sie, der config-Datei Ihres Clients denselben Extension-Abschnitt hinzuzufügen, wie in der Konfigurationsdatei des Servers.

+0

Jacob, ich benutze WCfTestClient.exe, Teil von VS2008 zu versuchen und aufrufen und meinen Dienst verwenden. Nicht sicher, wie ich diese Ref in WcfTestClient.exe hinzufügen würde – user38230

+0

Ich meinte, dass Sie die Erweiterung zu Ihrer Client-Anwendung hinzufügen können.Ich nehme an, dass ich davon ausgehe, dass Sie auch einen Client für Ihren Webservice schreiben, und Ihr Problem war, dass Sie keine Referenz hinzufügen konnten. Ich bin nicht sehr vertraut mit WcfTestClient.exe. Wenn Sie die WSDL veröffentlichen, die generiert wird, können wir möglicherweise leichter helfen. – Jacob

+0

Jacob, wird die WSDL am Ende des Tages oder morgen veröffentlichen, sobald die Server für mich verfügbar sind. – user38230

0

Ihre Bindung ist basicHttpBinding, aber Ihre Bindungskonfiguration ist wsHttpMTOMBinding.

Das sieht wie ein Mismatch aus, aber es könnte nur die Namen sein, die Sie Dinge gegeben haben.

Versuchen Sie, die Konfigurationsdatei im WCF-Konfigurationstool zu öffnen, dies sollte Ihnen sagen (weigern Sie, die Datei zu öffnen), wenn es in der Konfigurationsdatei Inkonsistenzen gibt.

hoffte, das hilft

Shiraz

+0

Shiraz, Ich habe 1 Methode, die Inhalt der Datei zurückgibt und sein Rückgabetyp ist Bytes []. Alle meine anderen Methoden geben Strings und Ints zurück und daher ging ich mit der Mtom-Binding-Konfiguration. Ich bin nicht sicher, ob ich verschiedene Bindungskonfigurationen auf Methoden anwenden kann, die große Dateien als Bytes [] zurückliefern, und verschiedene Bindungskonfigurationen auf Methoden, die Strings und Ints zurückgeben – user38230

+0

Was ich sagen wollte, war, dass man nicht basichttp und wshttp am selben Endpunkt kombinieren kann. In einem unserer Projekte haben wir die gleiche Situation wie Sie, dort haben wir einfach nur Bashtttpbinding verwendet, mit den Nachrichtengrößen hoch genug gesetzt. Wir haben dies verwendet, um Dateien von bis zu 30 MB zu senden. Dies ist nicht so effizient wie die Verwendung von MTOM in Bezug auf die Speichernutzung, aber wir hatten genügend Speicher, so dass es kein Problem war. Ich würde vorschlagen, dass Sie zuerst versuchen, Basichttp Bindung, ohne MTOM. Wenn Sie MTOM benötigen, teilen Sie den Vertrag auf und überprüfen Sie, ob Sie wshttpbinding verwenden. –

0

Dies ist keine wahre Antwort sein kann, aber nachdem ich WCfExtras Referenzen aus meiner app.config-Datei entfernt und entfaltet wird, scheinen die Dinge zu arbeiten. Diese

ist das, was ich versuchte, zu erreichen, aber aufgegeben haben für die Zeit

sein

WCF Extras

Wenn jemand eine Idee hat, wie und was ich falsch konfiguriert, raten Sie bitte auf diese Spalte.

Vielen Dank

0

Die Antwort für mich in der Lage sein, den WCF-Testclient zu verwenden, ist die Menge Singlefile = „true“ in der Web-Config wie folgt einzustellen.

<behavior name="Sample.WsdlSampleEndpointBehavior"> 
     <wsdlExtensions location="http://localhost:8731/TestApp/Service1/" singleFile="true" /> 
</behavior> 
1

Ich habe das gleiche Problem. Ich hosste den WCF auf remote Win2008 Server auf IIS. Die Lösung, die für mich gearbeitet hat, war das Festlegen des Hostnamens beim Hinzufügen der Website und lassen Sie es nicht leer, nachdem Sie alle anderen Daten für das Hosting eingestellt haben!

Verwandte Themen