Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[WCF C#] Bad Request 400 Error

Pagina: 1
Acties:

  • Blitz
  • Registratie: Januari 2000
  • Laatst online: 18-10 16:10
Hallo,

Ik ben momenteel bezig met maken van een Webservice applicatie in Visual Studio 2010. Ik heb een Service gemaakt waar een SQL Server achter schuilt en de service wordt door een WPF applicatie aangeroepen die dan alles netjes in de Server weg ruimt. Dit werkt perfect.

Waar het alleen mis gaat is het volgende:

- Als ik een foto of een groot bestand toevoeg aan mijn programma en dan probeer het model op te slaan krijg ik onmidelijk een bad request 400. Dit komt volgens mijn google searches omdat WCF een Message size aanhoudt die ik waarschijnlijk nu keihard overstreed. in mijn Client App.config heb ik de volgende aanpassingen gemaakt :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IBaseCommunicator" closeTimeout="00:01:00"
                    openTimeout="00:03:00" receiveTimeout="00:15:00" sendTimeout="00:03:00"
                    allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
                    maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
                    messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
                    useDefaultWebProxy="true">
                  <readerQuotas maxArrayLength="2147483647" maxNameTableCharCount="2147483647"          
                                maxStringContentLength="2147483647" maxDepth="2147483647"         
                                maxBytesPerRead="2147483647" />
                    <security mode="None">
                        <transport clientCredentialType="None" proxyCredentialType="None"
                            realm="" />
                        <message clientCredentialType="UserName" algorithmSuite="Default" />
                    </security>
                </binding>
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:3368/Service.svc"
                binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IBaseCommunicator"
                contract="Communicator.IBaseCommunicator" name="BasicHttpBinding_IBaseCommunicator" />
        </client>
    </system.serviceModel>
</configuration>


Dit lost helaas het probleem niet op, als ik naar de Web.Config van de server kijk zie ik het volgende :

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0"?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Warning">
        <listeners>
          <add name="WcfLogSample" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="WcfLogSample" type="System.Diagnostics.XmlWriterTraceListener"
             initializeData="C:\log\Traces2.svclog" traceOutputOptions="Callstack" />
    </sharedListeners>
    <trace autoflush="true" />
  </system.diagnostics>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxRequestLength="1048576" executionTimeout="3600"/>
  </system.web>
  <system.serviceModel>
    <bindings />
    <client />
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 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="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
  
</configuration>


Zoals de code al laat zien heb ik al geprobeerd het te debuggen maar ik kom niet verder helaas. Weet iemand hoe ik de message size vergroot op de server? Of hoe dit soort problemen over het algemeen ontstaan? Ik gebruik in Visual Studio de interne server dat een standaard port nummer geeft en altijd local draait.

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Probleem is dat als je de client side aanpast, de server nog steeds op de oude config draait :P.

Gebruik de Service Configuration Editor, (svcconfigeditor.exe) om de web.config van de server te openen (ik zou eerst een backup maken :P).

Vervolgens pas je de Binding config aan en zet je je MaxRecievedMessageSize op dezelfde grootte als in de client. Vergeet niet om MaxBufferSize en MaxContentStringLength op dezelfde waarde zetten als MaxRecievedMessageSize. wat info

Dat gezegd, een foto uploaden is tot daar aan toe, maar wat versta jij onder "grote" bestanden? Als je namelijk erg grote bestanden hebt, dan is het wellicht handig om hier streaming voor te gebruiken, dit is veel efficienter en uiteindelijk de enige oplossing.

Standaard communiceert WCF namelijk volgens een Message paradigma (zoals je ongetwijfeld wel al gemerkt heb). Dit houd dus in dat elke request in een Message gewrapped wordt, en deze gaat over de lijn.
Het is dus niet mogelijk om het uploaden van bestanden over meerdere Messages, en dus Requests te spreiden.
Het kan wel, maar dit moet je dan zelf implementeren.

Wat veel voorkomt is dat men een apart service ernaast draait welke in streaming mode staat geconfigureerd en er speciaal voor is om grote bestanden te ontvangen.

[ Voor 10% gewijzigd door D-Raven op 05-04-2011 15:34 ]


  • Blitz
  • Registratie: Januari 2000
  • Laatst online: 18-10 16:10
Hoi Deathraven,

Dank je voor het antwoord. De Service Configuration Editor kan ik helaas om een of andere rede niet gebruiken. Als ik de Service wil toevoegen beweert hij dat de .dll geen service heeft (hoewel ik hem gaan aanroepen!).

Het gaat over het algemeen om 400kb-2MB foto's maximimaal het zal natuurlijk misgaan denk ik als je veel bestanden hebt.. overigens lijkt het alsof in mijn geval er helemaal geen server config is waardoor hij altijd de defaults zal aanroepen waarschijnlijk heb ik het fout?

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Blitz schreef op dinsdag 05 april 2011 @ 15:38:
Hoi Deathraven,

Dank je voor het antwoord. De Service Configuration Editor kan ik helaas om een of andere rede niet gebruiken. Als ik de Service wil toevoegen beweert hij dat de .dll geen service heeft (hoewel ik hem gaan aanroepen!).
Je web config mist je gehele service configuratie, welk config bestand bevat je service configuratie ? Deze moet je openen. De VisualStudio WCF service host werkt ook zeg je, deze moet toch ergens zijn config vandaan halen. Dat ding gaat echt niet automatisch op de basicHttpBinding hosten :P
Het gaat over het algemeen om 400kb-2MB foto's maximimaal het zal natuurlijk misgaan denk ik als je veel bestanden hebt.. overigens lijkt het alsof in mijn geval er helemaal geen server config is waardoor hij altijd de defaults zal aanroepen waarschijnlijk heb ik het fout?
Als het bij die groottes blijft dan kom je er nog wel mee weg. Waarom denk je dat het mis zal gaan als je veel bestanden hebt?

En inderdaad dat denk je verkeerd, er zijn een hoop defaults maar de meest basic WCF configuratie bevat nog altijd de ABC

  • Blitz
  • Registratie: Januari 2000
  • Laatst online: 18-10 16:10
Dat is dus ook wat mij verbaasd. Maar het is sinds .NET4 zo dat als er geen endpoint kan worden gevonden hij gewoon een default endpoint aanmaakt en daarmee vrolijk verder gaat.Als ik naar de WebService ga en kijk naar de configuatie dan zie ik absoluut geen endpoint aangemaakt worden.:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<?xml version="1.0"?>
<configuration>
  <system.diagnostics>
    <sources>
      <source name="System.ServiceModel" switchValue="Warning">
        <listeners>
          <add name="WcfLogSample" />
        </listeners>
      </source>
    </sources>
    <sharedListeners>
      <add name="WcfLogSample" type="System.Diagnostics.XmlWriterTraceListener"
             initializeData="C:\log\Traces2.svclog" traceOutputOptions="Callstack" />
    </sharedListeners>
    <trace autoflush="true" />
  </system.diagnostics>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxQueryStringLength="1049576" maxRequestLength="1048576" executionTimeout="3600"/>
  </system.web>
  <system.serviceModel>
    <bindings />
    <client />
    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- 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="false" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
 <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>
  
</configuration>



De ABC is nergens te bvinden wat enorm storend is :( ik heb al meerdere manieren geprobeerd om de webservice wel werkend te krijgen via de config maar tot dusver vang ik bot.

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Blitz schreef op dinsdag 05 april 2011 @ 15:53:
Dat is dus ook wat mij verbaasd. Maar het is sinds .NET4 zo dat als er geen endpoint kan worden gevonden hij gewoon een default endpoint aanmaakt en daarmee vrolijk verder gaat.Als ik naar de WebService ga en kijk naar de configuatie dan zie ik absoluut geen endpoint aangemaakt worden.:

code:
1
..



De ABC is nergens te bvinden wat enorm storend is :( ik heb al meerdere manieren geprobeerd om de webservice wel werkend te krijgen via de config maar tot dusver vang ik bot.
Ah 4.0. tja goed, veranderd verder niks. Je hebt toch een WCF service library? Als je een foutmelding krijgt bij het openen van die library in de Service Config Editor dan is er iets niet goed. Library is niet goed gebuild, je hebt m niet aangemaakt als WCF Service Library, etc.

Ik zou zeggen probeer het eens met een nieuwe WCF Service library project. Als dat niet werkt dan weet je iig dat er iets niet goed zit in je VS/.Net installatie.

  • Blitz
  • Registratie: Januari 2000
  • Laatst online: 18-10 16:10
Ik heb een service.svc bestand in het project zitten, en nu ik er over nadenk werkt de webservice ook niet tenzij ik handmatig die SVC "View in browser" Waarschijnlijk moet ik zelf handmatig de endpoint aanmaken. Vind WCF echt irritant.

Verwijderd

.NET 4 verandert een heleboel aangezien ze hierbij gekozen hebben voor "convention over configuration". Je kan tegenwoordig ook services, endpoints en bindings zonder naam opnemen deze worden dan als default bindings gebruikt.

Je kan dus een basicHttpBinding configuratie zonder naam toevoegen als het goed is pakt je service die dan. Je kan ook gewoon op de pre-.NET 4 manier een service element opnemen met een endpoint (bevat ABC) en een binding configuration.

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Blitz schreef op dinsdag 05 april 2011 @ 16:20:
Ik heb een service.svc bestand in het project zitten, en nu ik er over nadenk werkt de webservice ook niet tenzij ik handmatig die SVC "View in browser" Waarschijnlijk moet ik zelf handmatig de endpoint aanmaken. Vind WCF echt irritant.
Wat betreft je configuratie, je zou natuurlijk ook een nieuwe WCF Service library kunnen maken, hierop met de Service Configuration Editor de gewenste configuratie wijzigingen maken, en deze wijzigingen vervolgens kopieren.

Een voorbeeld van een default basicHttpBinding waarbij ik de waardes een klein beetje groter heb gemaakt:

XML:
1
2
3
4
5
6
7
<bindings>
      <basicHttpBinding>
        <binding name="myCustomHttpBindingWithLargerMessageSize" 
         maxBufferSize="6553600" maxBufferPoolSize="6553600" maxReceivedMessageSize="6553600">
        </binding>
      </basicHttpBinding>
    </bindings>



Afhankelijk van hoe je Message eruit ziet kan het zijn dat je ook wat met readerQuotas moet gaan doen. Hiermee configureer je wat specifieke van de serializer die gebruikt om het bericht in te lezen. Meer info is hierover is volop te vinden in google.

[ Voor 26% gewijzigd door D-Raven op 06-04-2011 11:08 ]


  • Blitz
  • Registratie: Januari 2000
  • Laatst online: 18-10 16:10
Dank je voor de hulp :)

Hiermee was het probleem opgelost:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?xml version="1.0"?>
<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime maxQueryStringLength="1049576" maxRequestLength="1048576" executionTimeout="3600"/>
  </system.web>
  <system.serviceModel>

    <protocolMapping>
      <add scheme="http" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_IBaseCommunicator" />
    </protocolMapping>

    <bindings>

      <basicHttpBinding>
        <binding name="BasicHttpBinding_IBaseCommunicator" closeTimeout="00:01:00"
            openTimeout="00:03:00" receiveTimeout="00:15:00" sendTimeout="00:03:00"
            allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
            maxBufferPoolSize="2147483647" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647"
            messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
            useDefaultWebProxy="true">
          <readerQuotas maxArrayLength="2147483647" maxNameTableCharCount="2147483647"
                        maxStringContentLength="2147483647" maxDepth="2147483647"
                        maxBytesPerRead="2147483647" />
          <security mode="None">
            <transport clientCredentialType="None" proxyCredentialType="None"
                realm="" />
            <message clientCredentialType="UserName" algorithmSuite="Default" />
          </security>
        </binding>
      </basicHttpBinding>

    </bindings>

    <behaviors>

      <serviceBehaviors>

        <behavior name="">
          <dataContractSerializer maxItemsInObjectGraph="2147483646" />
          <serviceMetadata httpGetEnabled="true" />

          <serviceDebug includeExceptionDetailInFaults="true" />

        </behavior>

      </serviceBehaviors>

    </behaviors>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true" />
  </system.webServer>

</configuration>

  • D-Raven
  • Registratie: November 2001
  • Laatst online: 16-10 10:47
Die ReadersQuota config. :D. Wat dacht jij, laten we deze mier eens met boeing 747 platstampen ? :+

Pas op daarmee, je kunt namelijk je service opblazen. Ook omdat je je timeouts verhoogd hebt. Omdat het bericht niet gestreamt wordt, word het hele bericht in geheugen geladen dus als jij voldoende clients hebt die iets naar je service aan het uploaden is. Kan je in feite je eigen service DDos'en.
Ik zou een limiet instellen op de client van hoe groot de berichten mogen zijn, en deze limiet laten terugkomen in je WCF config.

  • Blitz
  • Registratie: Januari 2000
  • Laatst online: 18-10 16:10
hahaha het was een noodgeval ;) had een presentatie gisteren en kreeg de config niet aan de praat :P

ik wou eigenlijk een Airbus gebruiken om een mier te egaliseren met de vloer.

Ik gaeens kijken hoe ik streaming doe in WCF. Het is wel handig voor de galleryviewer die ik zo ga maken :)
Pagina: 1