Я хочу создать веб-метод, который принимает Список пользовательских объектов (передал на пути jQuery/JSON).
Когда я выполняю веб-сайт локально, все, кажется, работает. jQuery и ASP.NET и все счастливы. Но когда я поместил его на один из наших серверов, это аварийно завершается. jQuery получает 500 ошибок после запроса ajax с ответом тем, чтобы быть:
Система. InvalidOperationException: имя метода веб-сервиса EditCustomObjects не допустимо.
Вот метод веб-сервиса:
[WebMethod]
public void EditCustomObjects(int ID, List CustomObjectList)
{
// Code here
}
И мой код jQuery (то, которое я не думаю вопросы, начиная с ошибки, кажется, происходит на уровне веб-сервиса):
var data = JSON.stringify({
ID: id,
CustomObjectList: customObjectList
});
$.ajax({
type: "POST",
url: "/manageobjects.asmx/EditCustomObjects",
data: data,
contentType: "application/json; charset=utf-8",
async: false,
dataType: "json",
success: function(xml, ajaxStatus) {
// stuff here
}
});
customObjectList инициализируется как так:
var customObjectList = [];
И я добавляю объекты к нему как так (через цикл):
var itemObject = {
ObjectTitle = objectTitle,
ObjectDescription = objectDescription,
ObjectValue = objectValue
}
customObjectList.push(itemObject);
Так, я делаю что-то не так здесь? Существует ли лучший способ передать массив данных от jQuery до метода веб-сервиса ASP.NET? Есть ли способ разрешить, что "имя метода веб-сервиса не допустимо". ошибка?
К вашему сведению я выполняю.NET 2.0 на машине Windows Server 2003, и я получил код для вышеупомянутого от этого сайта: http://elegantcode.com/2009/02/21/javascript-arrays-via-jquery-ajax-to-an-aspnet-webmethod/
Править: Кто-то запросил еще некоторую информацию о веб-сервисе, я скорее не обеспечу целый класс, но здесь немного больше, который может помочь:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService]
public class ManageObjects : Custom.Web.UI.Services.Service
{
}
Bara
Я предполагаю, основываясь на комментариях, что вы можете напрямую перейти к веб-службе в браузере.
Чтобы изолировать свой настраиваемый объект от конфигурации, вы можете добавить другую службу, например:
[WebMethod]
public static string GetServerTimeString()
{
return "Current Server Time: " + DateTime.Now.ToString();
}
Вызвать ее из клиентского вызова jQuery ajax. Если это работает, то, вероятно, это связано с вашим объектом, а не с конфигурацией на стороне сервера. В противном случае продолжайте следить за конфигурацией на стороне сервера.
РЕДАКТИРОВАТЬ: Пример кода:
[WebMethod(EnableSession = true)]
public Category[] GetCategoryList()
{
return GetCategories();
}
private Category[] GetCategories()
{
List<Category> category = new List<Category>();
CategoryCollection matchingCategories = CategoryList.GetCategoryList();
foreach (Category CategoryRow in matchingCategories)
{
category.Add(new Category(CategoryRow.CategoryId, CategoryRow.CategoryName));
}
return category.ToArray();
}
А вот пример того, как я публикую JSON-значение сложного типа данных
[WebMethod]
public static string SaveProcedureList(NewProcedureData procedureSaveData)
{
...do stuff here with my object
}
На самом деле оно включает в себя два массива объектов внутри него ... мой тип NewProcedureData определен в классе который излагает те.
EDIT2:
Вот как я обрабатываю сложный объект в одном экземпляре:
function cptRow(cptCode, cptCodeText, rowIndex)
{
this.cptCode = cptCode;
this.cptCodeText = cptCodeText;
this.modifierList = new Array();
//...more stuff here you get the idea
}
/* set up the save object */
function procedureSet()
{
this.provider = $('select#providerSelect option:selected').val(); // currentPageDoctor;
this.patientIdtdb = currentPatientIdtdb;// a javascript object (string)
//...more object build stuff.
this.cptRows = Array();
for (i = 0; i < currentRowCount; i++)
{
if ($('.cptIcdLinkRow').eq(i).find('.cptEntryArea').val() != watermarkText)
{
this.cptRows[i] = new cptRow($('.cptIcdLinkRow').eq(i).find('.cptCode').val(), $('.cptIcdLinkRow').eq(i).find('.cptEntryArea').val(), i);//this is a javscript function that handles the array object
};
};
};
//here is and example where I wrap up the object
function SaveCurrentProcedures()
{
var currentSet = new procedureSet();
var procedureData = "";
var testData = { procedureSaveData: currentSet };
procedureData = JSON.stringify(testData);
SaveProceduresData(procedureData);
};
function SaveProceduresData(procedureSaveData)
{
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
data: procedureSaveData,
the rest of the ajax call...
});
};
ПРИМЕЧАНИЕ! ВАЖНО! Для правильной работы имя procedureSaveData должно точно совпадать на стороне клиента и на стороне сервера. EDIT3 : подробнее пример кода:
using System;
using System.Collections.Generic;
using System.Web;
namespace MyNamespace.NewProcedure.BL
{
/// <summary>
/// lists of objects, names must match the JavaScript names
/// </summary>
public class NewProcedureData
{
private string _patientId = "";
private string _patientIdTdb = "";
private List<CptRows> _cptRows = new List<CptRows>();
public NewProcedureData()
{
}
public string PatientIdTdb
{
get { return _patientIdTdb; }
set { _patientIdTdb = value; }
}
public string PatientId
{
get { return _patientId; }
set { _patientId = value; }
}
public List<CptRows> CptRows = new List<CptRows>();
}
--------
using System;
using System.Collections.Generic;
using System.Web;
namespace MyNamespace.NewProcedure.BL
{
/// <summary>
/// lists of objects, names must match the JavaScript names
/// </summary>
public class CptRows
{
private string _cptCode = "";
private string _cptCodeText = "";
public CptRows()
{
}
public string CptCode
{
get { return _cptCode; }
set { _cptCode = value; }
}
public string CptCodeText
{
get { return _cptCodeText; }
set { _cptCodeText = value; }
}
}
}
Надеюсь, это поможет.
Вы можете проверить свой элемент webServices /tocols в разделе system.web и убедиться, что добавлен HttpPost. Обычно локальная публикация включена по умолчанию в качестве режима разработки, но не для удаленной, как это будет при развертывании службы на сервере ...
<system.web>
...
<webServices>
<protocols>
<add name="HttpPost" />
</protocols>
</webServices>
</system.web>
Я более подробно расскажу здесь
Но почему вы не используете Fancybox или более лучше colorbox здесь ссылка
http://colorpowered.com/colorbox/
Colorbox свет имеют крутой эффект просто дайте ему попробовать, и вы можете тематизировать его, как это css-based.
Спасибо
-121--3866250-Одна вещь, на которую нужно хотя бы посмотреть, это Луа. Это быстрый и язык, который я люблю использовать. iPhone Wax использует lua.
-121--2850140-Возможно, путь, по которому вы проходите с jquery, не существует, попробуйте увидеть ответ с помощью FireBug.
Зарегистрирован ли у вас необходимый httpHandler для разрешения веб-сервисов, помеченных как ScriptService?
<httpHandlers>
<add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
</httpHandlers>
Это неправильное объявление в javascript.
var itemObject = {
ObjectTitle = objectTitle,
ObjectDescription = objectDescription,
ObjectValue = objectValue
}
Правильная инициализация объекта должна быть:
var itemObject = {
ObjectTitle : objectTitle,
ObjectDescription : objectDescription,
ObjectValue : objectValue
};
Также попробуйте временно удалить async: false
из параметров $. Ajax
.
Должен сказать, я не на 100% продан, мой ответ (все) проблема, НО это решит десериализацию. Добавление некоторая деталь для вашего конкретного объекта.
на стороне клиента:
function itemObject (objectTitle, objectDescription ,objectValue )
{
this.ObjectTitle = objectTitle,;
this.ObjectDescription = objectDescription ;
this.ObjectValue = objectValue ;
};
// 4 objects in source-fix for your list
function objRow()
{
this.myCode = myCode;
this.myCodeText = myCodeText;
this.customObjectList = new Array();
for (k = 0; k < 4; k++)
{
this.customObjectList [k] = new itemObject (sourceTitle[k],sourceDescription[k],sourceValue[k]);
};
};
var myCode = "hicode1";
var myCodeText = "hicodeText1";
$(function()
{
function SaveCurrentObjects()
{
var currentSet = new objRow();
var objectData = "";
var testData = {objectSaveData : currentSet };
objectData = JSON.stringify(testData);
SaveObjectsData(objectData );
};
/* save the objects */
function SaveObjectsData(objectSaveData)
{
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
data: objectSaveData,
dataFilter: function(data)
{
var msg;
if (typeof (JSON) !== 'undefined' &&
typeof (JSON.parse) === 'function')
msg = JSON.parse(data);
else
msg = eval('(' + data + ')');
if (msg.hasOwnProperty('d'))
return msg.d;
else
return msg;
},
url: "/manageobjects.asmx/EditCustomObjects",
success: function(msg)
{
//do stuff
},
failure: function(msg)
{
//handlefail
}
});
};
});
на стороне сервера у вас будет: (точное имя «objectSaveData») как в клиентском коде.
[WebMethod]
public static string EditCustomObjects(ObjectData objectSaveData)
{
// code to save your object
return "saved objects";
}
создать класс ObjectData, содержащий список objectItem, аналогичный моему другому примеру сопоставления объектов (осторожно с именами).
ПРИМЕЧАНИЕ. У меня установлены расширения ASP.NET ajax - в этом примере я работаю с кодом asp.net 2.0.
Всякий раз, когда я получаю подобные ошибки (работая на локальном компьютере, но не на сервере), я запускаю инструмент администрирования IIS (или что-то еще, что вы используете) и проверяю, что все ТОЧНО одинаково . Если не сделать их такими же, то меняйте по одной мелочи за раз.
В зависимости от вашей роли / организации у вас может не быть доступа к серверу таким образом, но часто эти ошибки сводятся к самому странному случайному флажку на вкладке, на которую вы никогда не смотрите.
Это долгий путь, но ничего не поделаешь.
Поскольку в ошибке упоминается проблема с именем веб-метода, я подозреваю, что это полностью связано с проблемами в том, как генерируется WSDL и сопоставляется с веб-службой. Я вижу две потенциальные проблемы:
ID
- это ужасно распространенное имя, которое может быть зарезервировано или может вызывать конфликты. Попробуйте переименовать его в objectId
(имена параметров с заглавной буквы в любом случае не являются нормой для .NET)List
или CustomObject[]
, может конфликтовать с именем вашего параметра CustomObjectList
. Попробуйте переименовать второй параметр в customObjects
. Или, возможно, здесь играют роль какие-то другие глупые проблемы фреймворка. В любом случае, вам следует добавить к своему вопросу WSDL, сгенерированный .NET. Вы можете получить WSDL XML, загрузив /manageobjects.asmx?WSDL с вашего веб-сервера.