Avatar billede Red0z Nybegynder
10. april 2011 - 03:37 Der er 13 kommentarer og
1 løsning

WCF Service m. JSon virker ikke når det er uploadet.

Hey drengene.

Sidder og leger lidt med noget Silverlight hjemmeside. Til det benytter jeg en WCF Service.
WCF Servicen trækker nogle JSon objekter, og så skal noget logik så sørge for at disse objekter kommer frem i kommentarfelterne på siden.

Dette virker ! ... lokalt!

Når jeg publisher siden virker det ikke, og jeg får følgende fejl.

Webpage error details

User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
Timestamp: Sun, 10 Apr 2011 01:10:21 UTC


Message: Unhandled Error in Silverlight Application An exception occurred during the operation, making the result invalid.  Check InnerException for exception details. 


at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()
 
at SharpProgramming.CommentService.GetCommentListCompletedEventArgs.get_Result()
 
at SharpProgramming.Views.CommentsPage.crt_GetCommentListCompleted(Object sender, GetCommentListCompletedEventArgs e)
 
at
SharpProgramming.CommentService.CommentRetrievalServiceClient.OnGetCommentListCompleted(Object state)

Line: 1
Char: 1
Code: 0
URI: http://sharpprogramming.net/Silverlight.js

Jeg sad og overvejede om det var grundet at den service jeg havde oprettet altid kalder Localhost, og den jo gerne skulle have fat i hjemmesiden. Så prøvede at uploade servicen og derefter lave den som reference. Men modtager denne fejl.

The document at the url http://www.sharpprogramming.net/CommentRetrievalService.svc was not recognized as a known document type.
The error message from each known type may help you fix the problem:
- Report from 'XML Schema' is 'Name cannot begin with the '%' character, hexadecimal value 0x25. Line 1, position 2.'.
- Report from 'DISCO Document' is 'Name cannot begin with the '%' character, hexadecimal value 0x25. Line 1, position 2.'.
- Report from 'WSDL Document' is 'There is an error in XML document (1, 2).'.
  - Name cannot begin with the '%' character, hexadecimal value 0x25. Line 1, position 2.
Metadata contains a reference that cannot be resolved: 'http://www.sharpprogramming.net/CommentRetrievalService.svc'.
The content type text/plain of the response message does not match the content type of the binding (application/soap+xml; charset=utf-8). If using a custom encoder, be sure that the IsContentTypeSupported method is implemented properly. The first 149 bytes of the response were: '&#65279;<%@ ServiceHost Language="C#" Debug="true" Service="SharpProgramming.Web.CommentRetrievalService" CodeBehind="CommentRetrievalService.svc.cs" %>
'.
If the service is defined in the current solution, try building the solution and adding the service reference again.

Jeg bruger godt nok text/plain i mit .php hvor jeg forbinder til databasen. Men, det gør ingen forskel om det er der eller ej.

Ved ikke om det er noget meget simpel jeg har overset, men har ikke pillet med JSon og WCF Services før.

Så håber der er hjælp at hente.
Hvis der er nogle kodestumper i føler kunne være nyttige at se, så sig til, så poster jeg dem med det samme.

Her er et udkast af mit ServiceReference.ClientConfig
Hvis det skulle hjælpe lidt.

<configuration>
    <system.serviceModel>
        <bindings>
          <basicHttpBinding>
            <binding name="UserBasicHTTPBinding" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647">
              <security>
                <transport>
                  <extendedProtectionPolicy policyEnforcement="Never"/>
                </transport>
              </security>
            </binding>
          </basicHttpBinding>
         
            <customBinding>
                <binding name="CustomBinding_CommentRetrievalService">
                  <binaryMessageEncoding />
                    <httpTransport maxReceivedMessageSize="2147483647" maxBufferSize="2147483647" />
                </binding>
            </customBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:51608/CommentRetrievalService.svc"
                binding="customBinding" bindingConfiguration="CustomBinding_CommentRetrievalService"
                contract="CommentService.CommentRetrievalService" name="CustomBinding_CommentRetrievalService" />
        </client>
    </system.serviceModel>
</configuration>
Avatar billede arne_v Ekspert
10. april 2011 - 04:33 #1
Avatar billede Red0z Nybegynder
10. april 2011 - 04:40 #2
Ganske enig. Prøvede at ændre den. Men uden held.

Tror dog ikke min host har IIS. Er det ikke et krav for WCF ?
Hvid det er, er der så en anden måde at deseralisere JSon objekterne på ?
Avatar billede arne_v Ekspert
10. april 2011 - 04:54 #3
Jo. WCF kraever IIS og ASP.NET for HTTP binding.
Avatar billede Red0z Nybegynder
10. april 2011 - 05:09 #4
Hvad kan man gøre som alternativ ? Kan man ikke trække på json objekterne fra Silverlight ? De skal jo bare hemtes fra .php siden
Avatar billede arne_v Ekspert
10. april 2011 - 05:20 #5
Du kan sagtens hente fra en PHP side.

Du skal bare kode efter det.

WebClient.DownloadString var nok oplagt.
Avatar billede Red0z Nybegynder
22. maj 2011 - 19:45 #6
Undskyld min inaktivitet, men nu er der lidt nyt da jeg endelig har haft tid til at kigge lidt på sagen.

Er kommet lidt længere frem, men nu virker problemet lidt anderledes.

client.DownloadStringCompleted += (sender, e) =>
                {
                    e.Result.Remove(0, 1);
                    e.Result.Remove(e.Result.Length - 1);

                        using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(e.Result)))
                        {
                            list = (List<Utilities.JSon.UserCommentItem>)serializer.ReadObject(ms);

                            foreach (var v in list)
                            {
                                CommentField.Children.Add(AddCommentObject(v));
                            }
                        }
                };
            client.DownloadStringAsync(uri);
          }

Når den kommer til 'list = (List<Utilities.JSon.UserCommentItem>)serializer.ReadObject(ms);'stopper den, den kommer ikke videre end det, men den fryser heller ikke. Prøvede at sætte en MessageBox.Show() bagefter for debug, men den kom aldrig så langt.

Så sidder lidt forvirret.
Avatar billede arne_v Ekspert
22. maj 2011 - 21:17 #7
Jeg har meget svaert ved at tro at JSON deserializer forventer UTF-16 !!
Avatar billede Red0z Nybegynder
22. maj 2011 - 22:50 #8
Har ikke haft problemer med at deserializerer på trods af den faktisk stod til UNICODE frem for UTF-8, for en god ordens skyld har jeg dog forsøgt mig med UTF8 i stedet for.

Men det har ikke gjort udfaldet.
Har fået den til at kaste en exception.


Webpage error details

User Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
Timestamp: Sun, 22 May 2011 20:42:02 UTC


Message: Unhandled Error in Silverlight Application Object reference not set to an instance of an object.
  at SharpProgramming.Views.CommentsPage.<GetCommentList>b__0(Object sender, DownloadStringCompletedEventArgs e)
  at System.Net.WebClient.OnDownloadStringCompleted(DownloadStringCompletedEventArgs e)
  at System.Net.WebClient.DownloadStringOperationCompleted(Object arg)

Men står stadig forvirret tilbage. Fordi jeg er forholdsvis sikker på at jeg har lavet en instans af de ting der skal benyttes. Det eneste jeg ville kunne se der var noget galt med er den list..
Avatar billede arne_v Ekspert
22. maj 2011 - 23:04 #9
proev og oversaet med debug saa du faar et linie nummer
Avatar billede Red0z Nybegynder
22. maj 2011 - 23:16 #10
Grundet den opsætning der er hos min webhost kan jeg kun køre det fra hjemmesiden, da mit json query skal køres 'lokalt'.

Kan prøve at se om jeg kan oprette et lokalt scenarie
Avatar billede Red0z Nybegynder
22. maj 2011 - 23:29 #11
Som jeg mistænkte var det
list = (List<Utilities.JSon.UserCommentItem>)serializer.ReadObject(ms);

Den ender med at list = null. Så nu skal jeg bare finde ud af hvorfor dét er :)
Avatar billede Red0z Nybegynder
22. maj 2011 - 23:44 #12
Update -

Har faktisk lige fundet en ordentlig klodrian fejl.

Da jeg kalder

using(MemoryStream stream = new MemoryStream(Encoding.UTF8.GetBytes(e.Result)))
{
    var list = (List<Utilities.JSon.UserCommentItem>)serializer.ReadObject(ms);
}

Laver jeg en fejl ved at kalde en gammel MemoryStream instans, istedet for den jeg bruger i mit using, så logisk nok finder den aldrig vej til det content jeg forsøger at loade..
Avatar billede Red0z Nybegynder
23. maj 2011 - 01:02 #13
Det blev faktisk løst på den simple fejl !
Men Arne, smid et svar, mange tak for hjælpen ! :)
Avatar billede arne_v Ekspert
23. maj 2011 - 01:06 #14
ok
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester