locked
בעיה בשליחת / קבלת מידע מהסנסור ל-WCF SERVICE RRS feed

  • שאלה

  •  היי,  

    אני מפתח אפליקציה קטנה ל-windows phone, עובד ב- C# .net 4 על Samsung Omnia 7 מעה"פ windows phone 7.1.  

    אני רוצה לשלוח List של AccelerometerReading ל-WCF Service, הוא מתקבל בצד השרת, עם מספר נכון של אובייקטים אך הם אינם מאותחלים לערכים שנשלחו אלא לערכים דיפולטיים / ריקים.  

    התלבטתי איפה לפרסם את השאלה, אך מאחר ואולי יש השלכות לזה שאני מנסה לשלוח נתונים ל-Service דווקא מ-Windows Phone ולא מקליינט רגיל החלטתי לשים את זה פה

     

    קצת קוד:  זו המחלקה שאני מעביר בין הקליינט לשרת

    namespace myServiceApp

    {

     [DataContract] public class myContractClass

    {

    [DataMember]

    public List<AccelerometerReading> AccelerometerReadingQ { get; set; }

    }

     }

    זה ה - Service Contract:

    namespace myServiceApp

    {

    public interface ImyService

    {

    [OperationContract]

    string GetData(int value);  // Testing method, not relevant

    [OperationContract]

    string SaveData(myContractClass ContractClass);  // this is the method I use

    }

    }

    Web.Config:

    <?xml version="1.0" encoding="UTF-8"?>

     <configuration>

    <connectionStrings> ... </connectionStrings>

     <system.web>

     <compilation debug="true" targetFramework="4.0" />

     </system.web>

    <system.serviceModel>

    <bindings>

     <basicHttpBinding>

    <binding name="myService_basicHttpBinding" allowCookies="True" />

    </basicHttpBinding>

    <customBinding>

    <binding name="myService_binaryXMLBinding">

     <binaryMessageEncoding />

     <httpTransport />

     </binding>

    </customBinding>

                    </bindings>

                    <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>

    <services>

     <service name="myServiceApp.myService">

    <endpoint address="basic" binding="basicHttpBinding" bindingConfiguration="myService_basicHttpBinding" contract="myServiceApp.ImyService" />

    <endpoint address="binary" binding="customBinding" bindingConfiguration="myService_binaryXMLBinding" contract="myServiceApp.ImyService" />

     </service>

    </services>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

    </system.serviceModel>

    <system.webServer>

    <modules runAllManagedModulesForAllRequests="true" />

    <directoryBrowse enabled="true" />

    </system.webServer>

    </configuration>

    ב-2 ה- Endpoints הבעיה קורה, השני בעיקר למטרות השוואה ולימוד

    קוד מה- windows phone:      

    namespace Susmentia_Accelerometer
    {
        public partial class MainPage : PhoneApplicationPage
        {
            myServices.myContractClass ContractClass = 
                new myServices.myContractClass() { AccelerometerReadingQ = new List<AccelerometerReading>() };
     
            myServices.myServiceClient ServiceClient =
                new myServices.myServiceClient("BasicHttpBinding_ImyService");
    // Additional not relevant code
    }
    }

    [מצטער על הקוד הלא יפה, שיניתי קצת לפני הפרסום, בנוסף, עורך הקוד של הפורום העיף אותי 3 פעמים כבר, אז לא השתמשתי בו]

    אחרי חיפושים אינטנסיביים באינטרנט, ראיתי שיש לא מעט פוסטים שמדברים על הבעיה, אף אחד מהם לא עזר לי (או שלא מימשתי את הפתרון שהוצע שם בצורה נכונה(  

    בכל מקרה, בשלב הזה אני כבר אשמח לקצת עזרה.  תודה מראש לכל המנסים (והמצליחים כמובן  J )

     

     



    • נערך על-ידי lior.efraim יום רביעי 25 אפריל 2012 12:44
    יום רביעי 25 אפריל 2012 12:42

תשובות

  • the AccelerometerReading.Acceleration property has an internal setter so WCF cant serialize it.

    this is why you get the correct number of objects but without the right value. notice that vector3 type is serializable by itself so i guess the correct way for you to solve this is by  creating some DTO and send the vectors by yourself


    • סומן כתשובה על-ידי lior.efraim יום רביעי 25 אפריל 2012 15:50
    יום רביעי 25 אפריל 2012 15:17

כל התגובות

  • the AccelerometerReading.Acceleration property has an internal setter so WCF cant serialize it.

    this is why you get the correct number of objects but without the right value. notice that vector3 type is serializable by itself so i guess the correct way for you to solve this is by  creating some DTO and send the vectors by yourself


    • סומן כתשובה על-ידי lior.efraim יום רביעי 25 אפריל 2012 15:50
    יום רביעי 25 אפריל 2012 15:17
  • תמיר, אהבתי והערכתי אליך ידועות ברחבי הסייבר, ועכשיו - אפילו יותר :)

    עבד כמו קסם.

    הוספתי מחלקה שנראית ככה (בעצם מימוש שלי במקום AccelerometerReading):

    [DataContract]
        public class newContractClass
        {
            [DataMember]
            public Vector3 SensorReading { get; set; }
    
            [DataMember]
            public DateTimeOffset TimeStamp { get; set; }
    {

    ואז מהקליינט פשוט שלחתי List<T> של המחלקה הזו.

    חיה ארוכות ושגשג אחי ;)



    יום רביעי 25 אפריל 2012 15:50