WSON Web服务与JSON输出行为不端

时间:2011-03-08 15:30:19

标签: c# jquery wcf json

我一直在抨击这个近2天。我已经阅读了数百个博客,SO帖子和MSDN文章,我仍然没有得到我的WCF服务!

一些背景知识 我有两个项目:

  • 1 C#Web应用程序 - JQuery将使用WCF数据。我编写了一个JQuery代理,但我不确定它是否可行,因为我的WCF服务似乎没有响应!
  • 1 C#WCF服务 - 目前,我不希望比某些数据的某些验证服务更复杂。我想使用JQuery来检查这些服务,以验证表单上的用户输入(例如,有效的电子邮件)。

服务 - 目前,我只是想让IsEmailValid工作:

namespace AtomicService
{
    [ServiceContract]
    public interface IValidation
    {
        [OperationContract, WebInvoke(
            Method="POST",
            BodyStyle= WebMessageBodyStyle.Wrapped,
            RequestFormat = WebMessageFormat.Json, 
            ResponseFormat = WebMessageFormat.Json)]
        string IsEmailValid(string email);

        [OperationContract]
        bool DoesClientExist(string client);

        [OperationContract]
        bool IsPasswordOk(string password);

        [OperationContract]
        bool IsPostcodeValid(string postcode, string isoalpha2);

        [OperationContract]
        bool IsTelephoneValid(string telephone, string isoalpha2);
    }
}

我的实施:

namespace AtomicService
{
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Validation : IValidation
    {
        public string IsEmailValid(string email)
        {
            return string.Format("Response:{0}", AtomicCore.Validation.CheckEmail(email).ToString());
        }

        //others removed for brevity
    }
}

当我使用WCFTestClient测试我的web服务时,一切都很好: a check against the service using the WCFTestClient

使用Fiddler进行检查会返回400错误请求: enter image description here

此外,当我尝试使用浏览器访问该服务时,绝对没有发生 - 只是一个空白页。

当我使用我的JQuery代理时:

    /// <reference path="~/System/jquery.js" />

ServiceProxy = function () //constructor for the proxy
{
    this._baseURL = "http://127.0.0.1:88/Validation.svc/";
};

ServiceProxy.prototype =
{
//    getArticles: function (success, error) {
//        this._doAjax("GetArticles", null, success, error);
//    },

    isEmailValid: function (email, success, error) {
        var data = { email: email };

        this._doAjax("IsEmailValid", data, success, error)
    },

    _defaultErrorHandler: function (xhr, status, error) {
        alert(xhr.statusText + ' ' + error);
    },

    _doAjax: function (method, data, fnSuccess, fnError) {
        if (!data) data = {};

        if (!fnError) fnError = this._defaultErrorHandler;

        $.ajax({
            type: "GET",
            url: this._baseURL + method,
            data: data,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: fnSuccess,
            error: fnError,
            dataFilter: function (data) {
                var response;

                if (typeof (JSON) !== "undefined" && typeof (JSON.parse) === "function")
                    response = JSON.parse(data);
                else
                    response = eval("(" + data + ")");

                if (response.hasOwnProperty("d"))
                    return response.d;
                else
                    return response;
            }
        });
    }


};

我收到错误 - 但不知道错误是什么。我再也看不到树木了!

我完全不知所措? WCF似乎比旧的.NET ASMX服务方法更复杂,但我想尝试学习 - 到目前为止它一直很痛苦!

一如既往的帮助,赞赏。

2 个答案:

答案 0 :(得分:2)

您正在使用fiddler进行GET,并且您的方法已设置为使用POST。

您可以更改为在fiddler中执行POST,这应该在您设置请求正文后起作用。您可以捕获WCFTestClient正在做的事情,以便您了解差异。

答案 1 :(得分:0)

我自己在C#4.0中使用了带有EDMX对象的WCF数据服务,您需要注意的一件事是跨域请求。我不确定这是否是这种情况,但它始终值得关注。如果端口不同,它将属于跨域类别,因此除非您明确允许,否则将被浏览器阻止。