ASMX似乎要缓存

问题描述

| 我有以下ASMX Web服务:
// removed for brevity //

namespace AtomicService
{
    [WebService(Namespace = \"http://tempuri.org/\")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolBoxItem(false)]
    [ScriptService]
    public class Assets : WebService
    {
        private static readonly ILog Log = LogManager.GetLogger(typeof(Validation));
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string CityCreate(string cityname,string state,string country,decimal timezoneoffset,decimal lat,decimal lon)
        {
            var response = new Dictionary<string,string>();
            if(string.IsNullOrEmpty(cityname) || (string.IsNullOrEmpty(country)))
            {
                response.Add(\"Response\",\"empty\");
                return JsonConvert.SerializeObject(response,Formatting.Indented);
            }
            int tzid;
            int ctyid;
            try
            {
                tzid = AtomicCore.TimezoneObject.GetTimezoneIdByGMTOffset(timezoneoffset);
                var cty = AtomicCore.CountryObject.GetCountry(country);
                ctyid = cty.CountryId;
            }
            catch (Exception)
            {
                response.Add(\"Response\",\"errordb\");
                return JsonConvert.SerializeObject(response,Formatting.Indented);
            }
            if(AtomicCore.Validation.DoesCityAlreadyExistByLatLon(cityname,country,lat,lon))
            {
                response.Add(\"Response\",\"exists\");
                return JsonConvert.SerializeObject(response,Formatting.Indented);
            }
            const string pattern = @\"^(?<lat>(-?(90|(\\d|[1-8]\\d)(\\.\\d{1,6}){0,1})))\\,{1}(?<long>(-?(180|(\\d|\\d\\d|1[0-7]\\d)(\\.\\d{1,1})))$\";
            var check = new Regex(pattern,RegexOptions.IgnorePatternWhitespace);
            bool valid = check.IsMatch(lat + \",\" + lon);
            if(valid == false)
            {
                response.Add(\"Response\",\"badlatlon\");
                return JsonConvert.SerializeObject(response,Formatting.Indented);
            }
            BasicConfigurator.Configure();
            Log.Info(\"User created city; name:\" + cityname + \",state:\" + state + \",countryid:\" + ctyid + \",timezoneid:\" + tzid + \",lat:\" + lat + \",lon:\" + lon + \"\");

            //will return id of created city or 0.
            var result = AtomicCore.CityObject.CreateCity(cityname,state,ctyid,tzid,lat.ToString(),lon.ToString(),string.Empty);
            response.Add(\"Response\",result > 0 ? \"True\" : \"errordb\");
            return JsonConvert.SerializeObject(response,Formatting.Indented);
        }
    }
}
这通过JQueryѭ1调用调用
$.ajax({
                            type: \"POST\",url: \"http://<%=Atomic.UI.Helpers.CurrentServer()%>/AtomicService/Assets.asmx/CityCreate\",data: \"{\'cityname\':\'\" + $(\'#<%=litCity.ClientID%>\').val() + \"\',\'state\':\'\" + $(\'#<%=litState.ClientID%>\').val() + \"\',\'country\':\'<%=Session[\"BusinessCountry\"]%>\',\'timezoneoffset\':\'\" + $(\'#<%=litTimezone.ClientID%>\').val() + \"\',\'lat\':\'\" + $(\'#<%=litLat.ClientID%>\').val() + \"\',\'lon\':\'\" + $(\'#<%=litLng.ClientID%>\').val() + \"\'}\",contentType: \"application/json\",dataType: \"json\",success: function (msg) {
                                if (msg[\"d\"].length > 0) {
                                    var data = $.parseJSON(msg.d);
                                    if (data.Response > 0) {
                                        //everything has been saved,ideally we
                                        //want to get the cityid and pass it back
                                        //to the map page so we can select it...
                                        alert(\'Hazzah!\');
                                        $(this).dialog(\'close\');
                                    } else {
                                        if(data.Response == \'errordb\')
                                        {
                                            alert(\"db\");
                                        }
                                        if(data.Response == \'exists\')
                                        {
                                            alert(\"exists\");
                                        }
                                        if(data.Response == \'badlatlon\')
                                        {
                                            alert(\"badlatlon\");
                                        }
                                        if(data.Response == \'empty\')
                                        {
                                            alert(\"empty\");
                                        }

                                        $(\'#serviceloader\').hide();
                                        $(\'#<%=txtFindMyCity.ClientID%>:input\').attr(\'disabled\',false);
                                        $(\'#erroroccured\').show(\'slow\');
                                        $(\'#errortext\').html(\"Unfortunately,we can\'t save this right Now. We think this city may already exist within Atomic. Could you please check carefully and try again? If this is an obvIoUs error,please contact us and we\'ll get you started.\");
                                    }
                                } else {
                                    $(\'#serviceloader\').hide();
                                    $(\'#<%=txtFindMyCity.ClientID%>:input\').attr(\'disabled\',false);
                                    $(\'#erroroccured\').show(\'slow\');
                                    $(\'#errortext\').html(\"Unfortunately,we can\'t save this right Now. Our data service is not responding.  Could you perhaps try again in a few minutes? We\'re very sorry. Please contact us if this continues to happen.\");
                                }
                            },error: function (msg) {
                                $(\'#serviceloader\').hide();
                                $(\'#<%=txtFindMyCity.ClientID%>:input\').attr(\'disabled\',false);
                                $(\'#erroroccured\').show(\'slow\');
                                $(\'#errortext\').html(\"Unfortunately,we can\'t save this right Now. Perhaps something has gone wrong with some of our data services. Why not try again? If the problem persists,please let us kNow and we\'ll get you started.\");
                            }
                        });
尽管如此,我总是得到3英镑。我认为这可能是缓存问题-但我根本无法获得AJAX来运行该服务。当我直接转到asset.asmx并调用服务时,
CreateCity
方法将正确运行。 这是树木的经典木材-我看了太久了,我放弃了生存的意愿... 因此,问题是:我希望
CreateCity
服务在被
$.ajax
调用时能够正常工作,并且不会收到
{ \"Response\" : \"False\" }
响应。任何人都可以通过我提供的代码提供任何方向,帮助或协助来实现这一目标吗?请记住,我认为我的服务可能正在缓存(因此,the3ѭ响应)... 欢迎提供帮助,建议,意见和一般评论...     

解决方法

您无需手动将响应序列化为JSON。这由启用脚本的服务自动处理。只需从您的Web方法返回一个强类型对象。输入相同。另外,您还必须确保对请求参数进行正确的URL编码。因此,首先定义模型:
public class City
{
    public string Cityname { get; set; }
    public string State { get; set; }
    public string Country { get; set; }
    public decimal Timezoneoffset { get; set; }
    public decimal Lat { get; set; }
    public decimal Lon { get; set; }
}

public class Response
{
    public string Message { get; set; }
    public bool IsSuccess { get; set; }
}
接着:
[WebService(Namespace = \"http://tempuri.org/\")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class Assets : WebService
{
    private static readonly ILog Log = LogManager.GetLogger(typeof(Validation));

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public Response CityCreate(City city)
    {
        var response = new Response();

        // ... process and populate the return message,// set the IsSuccess boolean property which will
        // be used by the client (see next...)

        return response;
    }
}
在客户端:
$.ajax({
    type: \'POST\',url: \'<%= ResolveUrl(\"~/Assets.asmx/CityCreate\") %>\',contentType: \'application/json\',dataType: \'json\',data: JSON.stringify({ 
        cityname: $(\'#<%=litCity.ClientID%>\').val(),state: $(\'#<%=litState.ClientID%>\').val(),country: \'<%=Session[\"BusinessCountry\"]%>\',timezoneoffset: $(\'#<%=litTimezone.ClientID%>\').val(),lat: $(\'#<%=litLat.ClientID%>\').val(),lon: $(\'#<%=litLng.ClientID%>\').val()
    }),success: function (result) {
        // result.d will represent the response so you could:
        if (result.d.IsSuccess) {
             ...
        } else {
             ...
        }
    };
});
    ,您可以将
cache:false
添加到
%.ajax
调用中,以确保未对其进行缓存。您是否在服务上弹出了一个断点,以仔细检查jQuery正在传递的内容?