שליחת מערך של מחרוזות ב – GET לשירות שנכתב ב – WCF המוגדר לעבודה עם REST

11 באוקטובר 2011

תגיות: ,
2 תגובות


 


 

באחד הפוסטים בסדרת WCF הראיתי כיצד ניתן להגדיר שירותי WCF שיעבדו ב – REST ונוכל לגלוש אליו מהדפדפן בעזרת GET.

 

לפעמים אנחנו צריכים לקבל כפרמטר מערך של מחרוזות, במידה ונעשה את זה נקבל את השגיאה המפורטת, מה שאומר שהוא לא יודע כיצד להמיר את ה – query string למערך של מחרוזות.

 

Operation 'OPERATION' in contract 'CONTRACT' has a query variable named 'VARIABLE' of type 'System.String[]', but type 'System.String[]' is not convertible by 'QueryStringConverter'.  Variables for UriTemplate query values must have types that can be conve

 

מצאתי את הפתרון כאן, הרעיון הוא להגדיר Converter משלנו שיידע להמיר את ה – query string למערך של מחרוזת על ידי הגדרה מוסכמת מראש (פסיקים בין הערכים, או קבלת מחרוזת בפורמט JSON).

 

 

נתחיל בקוד שצריך לכתוב.

 

ראשית נירש ממחלקת WebHttpBehavior שהיא המחלקה הראשית המאפשרת rest ונשנה את המתודה שאחראית על החזרת ה – QueryStringConverter

 



public class CustomHttpBehavior : WebHttpBehavior


{


    protected override QueryStringConverter GetQueryStringConverter(OperationDescription operationDescription)


    {


        return new CustomQueryStringConverter();


    }


}


 

כעת נממש מחלקה משלנו שתדע להמיר מה – query string למערך של מחרוזות

שימו לב שבדוגמא אני מצרף דוגמא למימוש עם פסיק ומימוש עם json)

 



public class CustomQueryStringConverter : QueryStringConverter


{


    public override bool CanConvert(Type type)


    {


        if (type == typeof(string[]))


        {


            return true;


        }


 


        return base.CanConvert(type);


    }


 


    public override object ConvertStringToValue(string parameter, Type parameterType)


    {


        if (parameterType == typeof(string[]))


        {


            //with json option


            string[] parms = new JavaScriptSerializer().Deserialize<string[]>(parameter);


 


            //with comma delimited


            string[] parms = parameter.Split(',');


            return parms;


        }


 


        return base.ConvertStringToValue(parameter, parameterType);


    }


 


    public override string ConvertValueToString(object parameter, Type parameterType)


    {


        if (parameterType == typeof(string[]))


        {


            //with json option


            string valstring = new JavaScriptSerializer().Serialize(parameter);


 


            //with comma delimited


            string valstring = string.Join(",", parameter as string[]);


 


            return valstring;


        }


 


        return base.ConvertValueToString(parameter, parameterType);


    }


}


 

 

כעת צריך להגדיר BehaviorExtension המאפשר לנו להתערב בתהליך ה – request, response

 

 



public class CustomHttpBehaviorExtensionElement : BehaviorExtensionElement


{


    protected override object CreateBehavior()


    {


        return new CustomHttpBehavior();


    }


 


    public override Type BehaviorType


    {


        get { return typeof(CustomHttpBehavior); }


    }


}


 

 

הדבר האחרון הוא להגדיר את הקונפיג

 

 



<system.serviceModel>


 


  <services>


    <service name="ServiceImplementation.CRM">


      <endpoint address=""


                binding="webHttpBinding"


                contract="Contracts.ICRM"


                behaviorConfiguration="withWebHttp"></endpoint>


    </service>


  </services>


 


  <behaviors>


    <endpointBehaviors>


      <behavior name="withWebHttp">


        <customWebHttp />


      </behavior>


    </endpointBehaviors>


  </behaviors>


 


  <extensions>


    <behaviorExtensions>


      <add name="customWebHttp"


           type="WCFServiceWebRole1.CustomHttpBehaviorExtensionElement, WCFServiceWebRole1" />


    </behaviorExtensions>


  </extensions>


 


  <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />


</system.serviceModel>


 

 

וכעת נוכל לגלוש בצורה הבאה:

 


או עם json


הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

2 תגובות

  1. תקוה22 באוגוסט 2012 ב 12:43

    שלמה שלום
    רציתי לשאול לגבי שליחת פרמטרים בעברית במחרוזת הJSON.
    אני נתקעת עם שגיאה מוןזרה שזורק הWCF לגבי חוסר אפשרות לעשות סריאליזציה.
    מניחה שהבעיה מוכרת. האם יש פיתרון?
    איך שולחים פרמטר בעברית מJS לWCF?
    תודה!
    כתיבה וחתימה טובה!

    הגב