<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title></title>
    <script src="jquery-1.4.4.min.js" type="text/javascript"></script>
</head>
<body>
    X:<input id="Text1" type="text" />
    Y:<input id="Text2" type="text" />
    Value:<input id="Text3" type="text" />
    <input id="Button1" type="button" value="button" />
    <fieldset>
        <legend>结果输出:</legend>
        <div id="resultbox">

        </div>
    </fieldset>
    <script type="text/javascript">
        $(function () {
            $("#Button1").click(function () {
                $.ajax({
                    url: "Service1.svc/GetPoint",
                    contentType:"application/json",
                    type: "post",
                    datatype: "json",
                    data: JSON.stringify({ 'point': { 'X': $("#Text1").val(), 'Y': $("#Text2").val(), 'Value': $("#Text3").val()} }),
                    success: function (r,s,x) {
                        $("#resultbox").append("<p>" + JSON.stringify(r) + "</p>");
                    }
                });
            });
        });
    </script>
</body>
</html>

图片 1

上边的调用成功了,你是不是就觉着这么就完了吗?有未有想过假设WCF的劳动章程参数为指标(复合类型),例如:

    [ServiceContract]
    public interface IService1
    {
                  [OperationContract]
        [WebInvoke(Method = "*", UriTemplate = "Get/{value}", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        string GetData(string value);
    }

    public class Service1 : IService1
    {
        public string GetData(string value)
        {
            return string.Format("You entered: {0}", value);
        }
    }

下一场就试一下GET方法,在此笔者就有点难了,该如何进展GET请求呢?参数该怎么对应呢?作者将AJAX的TYPE改为GET,然后调用,最终结果回到如下图:

大家只供给通过浏览器访问如:http://localhost:14719/Service1.svc**/Get/test
 **
注意本身加深的部份,必要与该服务方法上预约的UriTemplate相相配,与MVC的ROUTE
U大切诺基L类似,POST也很简单,在此就不再表明。

Point定义:

也能够参见DUDU的小说:jQuery调用WCF服务时怎么样传递对象参数

{X:1,Y:二,Value:’test’}
、{‘X’:一,’Y’:二,’Value’:’test’}–这个不论KEY加不加引号,都是JSON对象,可以经过JSON.stringify方法转换来JSON字符串

一看就明白,调用战败,不恐怕为WCF的劳务情势参数point赋值,也等于WCF不能够正确将请求的参数解析成POINT类型对象实例,我尝试着平素在浏览器中做客:

WCF完毕RESETFUL框架结构很不难,说白了,就是使WCF能够响应HTTP请求并赶回所需的能源,假设有人不知底什么贯彻WCF援助HTTP请求的,可参见作者此前的文章《兑现jquery.ajax及原生的XMLHttpRequest调用WCF服务的秘诀》、《福寿无疆jquery.ajax及原生的XMLHttpRequest跨域调用WCF服务的措施》,在此就不作重述。

        [OperationContract]
        [WebInvoke(Method = "*",RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
        Point GetPoint(Point point);

“{X:一,Y:2,Value:’test’}”、”{‘X’:1,’Y’:二,’Value’:’test’}”–那几个就是JSON字符串,能够由此$.parseJSON方法转换来JSON对象

那边顺便提示一下,在POST请求WCF服务方法参数为指标时,注意AJAX请求的Data必需是JSON字符串,不可能是JSON对象,若是不驾驭两者的关系,作者那边大约说明一下,

http://localhost:14719/Service1.svc/GetPoint?point={x=1&y=2&value=test},结果仍是报同样的错误,这个问题却是困扰了我几天,我也曾请教过DUDU,QQ群,博问:http://q.cnblogs.com/q/77775/,都并未有人能回应作者,有人说复合类型不援助GET,用持续GET就无须用之类的话,笔者就想,小编的劳务契约上定义的是Method

“*”,而那边GET却非凡,难道不能用*,小编不抛弃,经过多方考查,那篇作品给了自笔者通晓的思绪:http://www.cnblogs.com/huangxincheng/p/4621971.html,可以通过自定义MessageFormatter来实现自己想要的解析,好了废话不多说,直接上代码。

自定义PointMessageFormatter:

    public class PointMessageFormatter:IDispatchMessageFormatter
    {
        private IDispatchMessageFormatter innerFormatter;

        public PointMessageFormatter(IDispatchMessageFormatter innerFormatter)
        {
            this.innerFormatter = innerFormatter;
        }

        public void DeserializeRequest(System.ServiceModel.Channels.Message message, object[] parameters)
        {
            innerFormatter.DeserializeRequest(message, parameters);

            if (message.Properties["HttpOperationName"].ToString().Equals("GetPoint",StringComparison.OrdinalIgnoreCase) && parameters.Count() > 0 && parameters[0] == null)
            {
                var request = message.Properties.Values.ElementAt(1) as HttpRequestMessageProperty;
                if (request.Method.Equals("GET", StringComparison.OrdinalIgnoreCase))
                {
                    parameters[0] = DeserializeFromQueryString(request.QueryString);
                }
            }

        }

        private object DeserializeFromQueryString(string queryString)
        {
            if (string.IsNullOrEmpty(queryString)) return null;
            var t=typeof(Point);
            var point = new Point();
            foreach (var p in t.GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                Regex regx = new Regex(string.Format(@"(?<={0}=)(.*?)(?=\&|$)", p.Name), RegexOptions.IgnoreCase);
                string value = regx.Match(queryString).Groups[1].Value;
                try
                {
                    var pValue = Convert.ChangeType(value,p.PropertyType);
                    p.SetValue(point, pValue, null);
                }
                catch
                { }

            }
            return point;
        }

        public System.ServiceModel.Channels.Message SerializeReply(MessageVersion messageVersion, object[] parameters, object result)
        {
            return innerFormatter.SerializeReply(messageVersion, parameters, result);
        }
    }

自定义MyOperationBehavior:

    public class MyOperationBehavior : Attribute, IOperationBehavior
    {
        public int MaxLength { get; set; }

        public void AddBindingParameters(OperationDescription operationDescription, BindingParameterCollection bindingParameters)
        {

        }

        public void ApplyClientBehavior(OperationDescription operationDescription, ClientOperation clientOperation)
        {

        }

        public void ApplyDispatchBehavior(OperationDescription operationDescription, DispatchOperation dispatchOperation)
        {
            dispatchOperation.Formatter = new PointMessageFormatter(dispatchOperation.Formatter);
        }

        public void Validate(OperationDescription operationDescription)
        {

        }
    }

下一场修改GetPoint服务方法完毕:

        [MyOperationBehavior]
        public Point GetPoint(Point point)
        {
            if (point == null)
            {
                throw new ArgumentNullException("point");
            }
            return point;
        }

实际上方法达成内容从未变,便是在其方式上平添了二个特征:MyOperationBehavior,目标是:当请求调用该格局时,会接纳我上边定义的PointMessageFormatter,从而完成了自定义解析。

提及底大家再考试通过GET请求,那里自身就径直通过浏览器访问:http://localhost:14719/Service1.svc/GetPoint?x=12&y=232&value=test,最后返回的结果如下:

图片 2

能够观望,调用成功,已经能健康解析到自作者的参数了,当然笔者上面的贯彻大概比较粗糙,也有很多的限制,但本身那边只是提供1种思路,一种缓解方案,大家能够遵照此思路完毕更牛B的成效。其实WCF的可扩展的地方越多,能够参见artech大拿关于WCF的文山会海小说,笔者感觉她的篇章写得相比深远,但哪怕科学懂。这篇小说小编也是花了好多生气来揣摩与消除,希望能援救到大家,假若以为不错,给个推荐呢,多谢!

  

您是不是足以像上面那样来开展GET或POST请求呢?假设能够,那么该怎么着调用呢?本身(梦在途中)是二个遭受了难点,就必需弄明白及要求化解的人,所以笔者进行了考试,首先试一下POST方法,示例代码如下:

经调用成功,结果如下图示:

福寿绵绵WCF扶助HTTP请求调用不难,但要完成类似MVC的ACTION及WEB
API那样的灵敏,这就得花费点武术,为啥这么说啊?因为只要WCF的参数为普通品种(即:值类型),那么调用很简单,也支撑HTTP的各个呼吁方法,比如大规模的:GET,POST,例如:

图片 3

    [DataContract(Namespace="http://www.zuowenjun.cn/")]
    public class Point
    {
        [DataMember]
        public int X { get; set; }

        [DataMember]
        public int Y { get; set; }

        [DataMember]
        public string Value { get; set; }
    }

        public Point GetPoint(Point point)
        {
            if (point == null)
            {
                throw new ArgumentNullException("point");
            }
            return point;
        }

相关文章

网站地图xml地图