c# - net - El servicio web ASMX que no devuelve JSON, solo puede POST usar application/x-www-form-urlencoded contentType
formdata web api c# (7)
Puedo llamar a mi servicio web usando jQuery IF contentType = "application / x-www-form-urlencoded; charset = utf-8"
Sin embargo, esto devolverá el xml: <string>[myjson]</string>
Si trato de POSTAR al servicio usando "application / json; charset = utf-8", recibo un error 500 con StackTrace y ExceptionType vacíos. Mi función de servicio web nunca se ve afectada, así que no estoy muy seguro de cómo solucionar esta situación.
Mis métodos y clases están decorados con los atributos adecuados y están configurados para usar JSON como su tipo de respuesta (al igual que mis archivos wsdl y disco). Tengo las extensiones Ajax instaladas y las entradas necesarias en web.config.
Esto se encuentra en una granja de servidores de SharePoint, pero no estoy seguro de que haga una gran diferencia. Implementé los cambios web.config en todos los WFE así como también instalé las extensiones ajax. De nuevo, el servicio funciona, simplemente no aceptará nada más que el tipo de contenido predeterminado.
No estoy seguro de lo que me falta aquí, muchachos ...
mi llamada ajax:
$.ajax({
type: "POST",
url: "/_vti_bin/calendar.asmx/Test",
dataType: "json",
data: "{}",
contentType: "application/json; charset=UTF-8",
success: function(msg){
alert(msg);
},
error: function(xhr, msg){ alert(msg + ''/n'' + xhr.responseText); }
});
Mi clase de servicio web:
[WebService(Namespace = "http://namespace")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ScriptService()]
public class CalendarService : WebService
{
[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string Test()
{
return "Hello World";
}
}
no estoy seguro de si podría ser así de simple, pero estoy usando jQuery para volver a llamar a JSON desde mis métodos web.
la principal diferencia que veo es el atributo de la clase
[System.Web.Script.Services.ScriptService]
[WebService(Namespace = "http://MyNameSpace")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.Web.Script.Services.ScriptService]
public class Web : System.Web.Services.WebService{
[WebMethod]
public string TestMethod(){
return "Testing";
}
}
Tengo que asumir que estás usando el framework 3.5 porque esa es la única manera de exponer los métodos web JSON.
Mis llamadas desde jQuery parecen prácticamente idénticas, así que no hay problema.
Parece que debe especificar json como el formato de respuesta en la etiqueta scriptMethod. Esto es de vb.net, pero estoy seguro de que tienes la idea:
ResponseFormat: = ResponseFormat.Json
Creo que está buscando WebInvoke o WebGet Attribute, le permite especificar Uri Template, body style, request y responseformats, por ejemplo:
[WebGet(ResponseFormat= WebMessageFormat.Json)]
Este enlace puede ayudar. Hay un artículo similar para WebInvoke (usado principalmente para publicaciones).
Uso bastante las llamadas JQuery AJAX JSON al servicio web ASMX. Funciona perfectamente en todos los navegadores. Estoy usando .NET 2.0 con las extensiones ASP.NET AJAX instaladas (incluido en 3.5).
Mi clase tiene los mismos decoradores que tu. Mis métodos solo tienen el [WebMethod(EnableSession = true)]
. Sin embargo, mi web.config tiene la siguiente entrada en su sección httpHandlers:
<add verb="*" path="*jsonservice.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
Mi llamada jquery se ve de la siguiente manera:
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "path/to/service/jsonservice.asmx/MethodName",
data: JSON.stringify(DTO),
dataType: "json",
success: function(rtrn) { alert("good"); },
error: function(req, msg, err) { alert("bad"); }
});
Este artículo es la raíz de mi conocimiento.
Tengo esto trabajando en 2.0 usando servicios web, pero he implementado protección de .d (vea el filtro de datos a continuación). También estoy devolviendo una variedad de objetos. NOTA: la clase del objeto es estática, o al menos no funcionaría correctamente para mí.
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
data: "{}",
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: "webservice/ModifierCodesService.asmx/GetModifierList",
success: function(msg)
{
LoadModifiers(msg);
},
failure: function(msg)
{
$("#Result").text("Modifiers did not load");
}
});
Aquí hay un fragmento de mi servicio web:
...
[WebService(Namespace = "http://mynamespace.com/ModifierCodesService/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
[ScriptService]
public class ModifierCodesService : System.Web.Services.WebService
{
/// <summary>
/// Get a list of Modifiers
/// </summary>
/// <returns></returns>
[WebMethod(EnableSession = true)]
public Modifier[] GetModifierList()
{
return GetModifiers();
}
/// <summary>
/// Modifiers list from database
/// </summary>
/// <returns></returns>
private Modifier[] GetModifiers()
{
List<Modifier> modifier = new List<Modifier>();
ModifierCollection matchingModifiers = ModifierList.GetModifierList();
foreach (Modifier ModifierRow in matchingModifiers)
{
modifier.Add(new Modifier(ModifierRow.ModifierCode, ModifierRow.Description));
}
return modifier.ToArray();
}
}
...
el código objeto:
public static class ModifierList
{
/// <summary>
/// Returns the Modifier Collection.
/// </summary>
/// <param name="prefix"></param>
/// <returns></returns>
public static ModifierCollection GetModifierList()
{
He estado luchando con esto hoy con una aplicación de iPhone hablando con un servicio web .Net.
Descubrí que si cambiaba mi Tipo de contenido a application / jsonrequest, se procesaba sin problemas y podía procesar los datos en mi servidor web.
Solo por sonrisas, agregué la línea mencionada anteriormente a mi web.config, pero no hizo que la aplicación / json funcionara.
Si está probando esto en IE, intente eliminar la declaración del juego de caracteres de su atributo contentType (es decir, debería verse así:
contentType: "application/json",
Todavía tengo que descubrir por qué, pero IE parece tener sus bragas en un giro cuando hace llamadas JSON con la parte " charset=UTF-8
".