- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在绞尽脑汁地试图弄清楚如何使用 jQuery 对 ASMX Web 服务进行 JSONP 调用。这些只是我已经阅读过但尚未找到任何解决方案的一些页面:
How to call external webservice using jquery "jsonp"?
Posting cross-domain JSON to ASP.NET with jQuery
Error while accessing ASP.net webservice using JQuery - JSONP
Set Headers with jQuery.ajax and JSONP?
http://www.codeproject.com/Articles/43038/Accessing-Remote-ASP-NET-Web-Services-Using-JSONP
http://encosia.com/using-jquery-to-consume-aspnet-json-web-services/
等等...
这是我的示例 .NET Web 方法:
[WebMethod]
[ScriptMethod(UseHttpGet = true, ResponseFormat = ResponseFormat.Json)]
public void GetEmployee(string employeeId, string callback)
{
// Get the employee object from the Factory.
Employee requestedEmployee = EmployeeFactory.GetEmployee(employeeId);
if(requestedEmployee != null)
{
// Return the padded JSON to the caller.
CrossDomainUtility.SendJsonP(callback, requestedEmployee.ToJson());
}
}
这是 SendJsonP():
public static void SendJsonP(string callback, string json)
{
// Clear any response that has already been prepared.
HttpContext.Current.Response.Clear();
// Set the content type to javascript, since we are technically returning Javascript code.
HttpContext.Current.Response.ContentType = "application/javascript";
// Create a function call by wrapping the JSON with the callback function name.
HttpContext.Current.Response.Write(String.Format("{0}({1})", callback, json));
// Complete this request, to prevent the ASMX web service from doing anything else.
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
这里是一些示例 jquery 代码:
$.ajax({
url: 'http://devserver/service/service.asmx/GetEmployee',
dataType: 'jsonp',
contentType: 'application/json',
data: { employeeId: '123456789' }
});
我使用 [ScriptService] 装饰了 Web 服务,并且将 web.config 配置为使用 ScriptHandlerFactory 处理 *.asmx。
我尝试过使用 ASMX 在 Content-Type 为“application/json”时使用的内置 JSON 序列化,但存在几个问题:由于需要填充,它无法用于 JSONP封装了 .NET 不支持的 JSON。它也不起作用,因为为了序列化 JSON,ASMX 需要“ContentType: application/json” header ,但 jQuery 在发送 GET 请求时会忽略 ContentType header (可能是因为它不发送任何内容)。我尝试在 Global.asax Application_BeginRequest() 中设置 Request.ContentType = "application/json"但没有执行任何操作。我还尝试使用 beforeSend() 在 jQuery 中设置请求 header ,但没有成功。
因此,由于我无法使用内置的 .NET 管道轻松使其工作,因此我采用了自己的技术来对响应主体执行原始写入(因此使用了 SendJsonP() 方法)。但我仍然遇到问题,因为即使 GetEmployee() Web 方法没有返回值,.NET 也会抛出序列化错误,因为它试图将对象序列化为 XML,因为我无法传递“application”的 ContentType/json' 带有 GET 请求。
因此,由于无论我做什么,我都无法让 jQuery 添加 ContentType,所以我想通过使用 Fiddler2 创建手动请求来测试我的 Web 服务:
GET http://devserver/service/service.asmx/GetEmployee?callback=createMember&memberId=123456789
User-Agent: Fiddler
Content-Type: application/json
Host: devserver
...并且它给出以下错误,因为我的参数不是 JSON:
{"Message":"Invalid JSON primitive: createMember [....] }
毕竟,我还有几个问题:
有没有办法使用内置的 .NET 序列化将填充应用于 JSON 并将其返回给客户端?
既然我必须自己动手,那么在将带有参数的 JSONP 查询发送到 ASMX 页面时,我的查询字符串应该如何显示?它必须采用 JSON 格式,但我已尝试以下操作并收到“无效的 JSON 原语”错误:
GetEmployee?{回调:“createMember”,memberId:“99999999”}
GetEmployee?callback={callback:"createMember"}&memberId={memberId:"123456789"}
有没有办法让 jQuery 通过 JSONP GET 请求发送 ContentType header ?
最佳答案
我刚刚决定手动处理 JSONP 请求。在我的解决方案中,用户必须通过 GET 请求提供两个查询字符串参数,以表明他们想要 JSONP 结果:callback=callbackFunctionName 和 jsonp=true。如果收到这两个请求,我将手动处理它,否则请求将继续发送到标准 ASMX 处理器。
我创建了一个新的 JsonPUtility 帮助程序类,并将其添加为 HttpApplication.BeginRequest 事件中的调用:
public class Global : System.Web.HttpApplication
{
protected void Application_BeginRequest(object sender, EventArgs e)
{
// Requests for JSONP requests must be handled manually due to the limitations of JSONP ASMX.
JsonPUtility.ProcessJsonPRequest();
}
}
这是 JsonPUtility 类:
/*
* JSON is Javascript Object Notation, a standard way of serializing objects in Javascript and
* other languages. For more information see http://www.json.org/.
*
* JSONP is a technique to enable the execution of Javascript that resides in a different domain. It
* works by exploiting the exception granted to the <script> tag which allows content to be loaded
* from a different domain. By contrast, making "regular" AJAX calls to a different domain will
* not work, usually throwing an "Access Denied" or "No Transport" error.
*
* JSONP (the "P" stands for "Padding") is regular JSON wrapped in a Javascript function call (the
* "Padding"). Take for example this standard JSON object:
* { "Name" : "John", "Age" : 14, "Gender" : "Male" }
*
* JSONP will turn that JSON into a valid Javascript function call by using the JSON as an argument
* to the callback function provided by the caller. For example, if the caller provides a callback
* value of 'processResults', the resulting JSONP looks like this:
* processResults({ "Name" : "John", "Age" : 14, "Gender" : "Male" });
*
* The processResults() function will then be able to use the JSON object just like a regular object.
* Note that the callback function must be implemented on the page that receives the JSONP, otherwise
* a standard Javascript error will occur.
*
* The real "trick" to cross-domain script execution is dynamically creating a "script" tag on the
* client for every JSONP request, using the web service URL as the "src" attribute. This will cause
* the browser to automatically download and execute the script that is loaded from the URL,
* effectively bypassing the same-domain origin policy.
*/
public static class JsonPUtility
{
/*
* SendJsonP(string callback, string json)
*
* This method takes the provided 'json' string, wraps it so that it is a parameter to the 'callback'
* function, clears any existing response text, writes the resulting Javascript code to the
* response, and ends the response.
*
* For example, given these two parameters...
* callback = "callbackFunction"
* json = "{ 'FOO': 'BAR', 'JOO': 'MAR' }"
*
* ... the following code is returned to the client in an HTTP response with a content-type of
* 'application/javascript':
* callbackFunction({ 'FOO': 'BAR', 'JOO': 'MAR' });
*
*/
public static void SendJsonP(string callback, string json)
{
// Clear any response that has already been prepared.
HttpContext.Current.Response.Clear();
// Set the content type to javascript, since we are technically returning Javascript code.
HttpContext.Current.Response.ContentType = "application/javascript";
// Create a function call by wrapping the JSON with the callback function name.
HttpContext.Current.Response.Write(String.Format("{0}({1});", callback, json));
// Complete this request, to prevent the ASMX web service from doing anything else.
HttpContext.Current.ApplicationInstance.CompleteRequest();
}
/*
* bool IsJsonPRequest()
*
* Determines whether or not the current request is for JSONP javascript code.
*
* This is the criteria for making a JSONP request to this web service:
* 1. Include the jsonp parameter. Its value is not important - we recommend using jsonp=true
* to increase clarity.
* 2. Include the callback=string parameter so we know what function call to wrap around
* the requested JSON.
*/
public static bool IsJsonPRequest()
{
// Store the context to the current request.
var request = HttpContext.Current.Request;
// If a 'jsonp' or a 'callback' parameter was not provided, this isn't a JSONP request.
if (request.QueryString["jsonp"] == null || String.IsNullOrEmpty(request.QueryString["callback"]))
return false;
// Since both parameters were provided, this is a jsonp request.
return true;
}
/*
* ProcessJsonPRequest()
*
* Manual processing is required for JSONP requests due to limitations in ASMX web services.
*/
public static void ProcessJsonPRequest()
{
// If this isn't a JSONP request, simply return and continue regular request processing.
if (!IsJsonPRequest())
return;
// Store the context to the HTTP request.
var request = HttpContext.Current.Request;
// Store the callback function that will be wrapped around the JSON string.
string callback = request.QueryString["callback"];
// Create a place to store the object that will be serialized into JSON.
object objectForJson = null;
// Store the web service method name that is being requested. It is always going to follow the
// final slash after the .asmx extension, and will continue until the question mark that marks
// the query string.
int methodNameStartIndex = request.RawUrl.ToUpper().IndexOf(".ASMX/") + 6;
int methodNameLength = (request.RawUrl.IndexOf("?")) - methodNameStartIndex;
string requestMethod = request.RawUrl.Substring(methodNameStartIndex, methodNameLength);
// Create a place to store the string ID of the object that is going to be looked-up.
string lookupId = null;
// Based on the request URL, figure out the method that will create a reference for the objectForJson variable.
switch (requestMethod)
{
case "GetEmployee":
// Get the employee's ID from the query string.
lookupId = request.QueryString["employeeId"];
// If the employee ID was provided, get a Employee object.
if (!String.IsNullOrEmpty(lookupId))
objectForJson = Factory.GetEmployee(lookupId);
break;
case "GetManager":
// Get the manager's ID from the query string.
lookupId = request.QueryString["managerId"];
// If the manager ID was provided, get a Manager object.
if (!String.IsNullOrEmpty(lookupId))
objectForJson = Factory.GetManager(lookupId);
break;
case "GetOrder":
// Get the order ID from the query string.
lookupId = request.QueryString["orderId"];
// If the order ID was provided, get the object.
if (!String.IsNullOrEmpty(lookupId))
objectForJson = Factory.GetOrder(lookupId);
break;
default:
// If the request method wasn't handled, throw an exception.
throw new ArgumentException("Unknown request method '" + requestMethod + "'.");
}
// Create a .NET framework object to serialize the object into JSON.
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
// Serialize the object into JSON. If objectForJson is null, the callback function will be passed a parameter of null (e.g. callback(null)).
string json = jsonSerializer.Serialize(objectForJson);
// Send the JSONP string back to the caller.
SendJsonP(callback, json);
}
}
我希望这可以帮助将来的人。
谢谢,文斯
关于jquery - JSONP 和 ASMX 网络服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13884253/
我有一个 asmx 服务,它接受一个 int 参数。我可以打开服务的 URL 并查看服务描述屏幕。从这里我可以将查询参数输入表单并调用 Web 服务。 有没有办法直接从 URL/查询字符串调用 Web
我有一个通过 SSL 连接运行良好的 ASMX Web 服务,但我想让这些 Web 服务在没有 SSL 的情况下无法访问。 在网络表单中,我只会使用以下代码: if (!Request.IsSecur
似乎 ASMX 隐含地不允许使用 OPTIONS 动词。我发布这个问题是因为我使用带有 POST 的 jQuery AJAX 调用,它首先在发出 POST 动词**之前向服务器查询可用的选项。 默认情
所以我发现自己遇到了一个难题。我们的应用程序中有一些旧的 asmx Web 服务,多年来一直运行良好。 突然间,他们停止了构建服务器(CI)上的工作。我说停止工作,因为即使当我导航到服务时显示服务描述
我有一个 C# .net Web 服务,需要限制其访问。我已经要求我的消费者使用用户名和密码来调用该服务。但是,有没有办法限制对实际 asmx 页面和 WSDL 的访问?我需要通过用户名/密码和 IP
描述 我有一个遗留类型 HttpRequestScoped以及使用该服务的遗留 Web 服务。为了解决遗留问题中的服务,我有一个全局解析器。这一切在 1.4 中运行良好,现在我正在使用 2.1.12,
有谁知道 SQL Server Reporting Services 中的两个 Web 服务端点 ReportService2005.asmx 和 ReportExecution2005.asmx 之
我有一个基本的 ASMX 服务,我正在尝试运行它(我宁愿使用 WCF,但无法让服务器使用它)。它在没有安全设置的情况下运行良好,但是一旦我打开安全性,我就会得到: The HTTP request i
在设计 ASMX 网络服务时,对您可以使用的类型有某种限制(序列化/反序列化)。 谁能告诉我这些限制是什么?是否可以通过在代码中添加serializable属性来绕过? 最佳答案 没有。传统的 ASM
我已经使用 CheckVat 方法创建了 ASMX 网络服务。如果我从 https://my.domain.com/VatValidation.asmx 调用此方法,我会得到成功的 json 响应,如
我正在通过经典的 asmx 网络服务传输一个大的压缩文本文件。我这样做的原因是文件的大小是 20 MB 解压缩,4MB 压缩。 这是方法。如有必要,我会提供更多信息。 [WebMethod]
我需要在客户端页面中使用 JavaScript 调用我的 Web 服务方法。我认为我没有正确引用这一点,希望您能帮助解决这一问题。 错误消息显示“CalendarHandler 未定义”。
我正在使用 ASP.NET 和 asmx 服务来访问我的 SQL 数据库的数据。 该服务既称为客户端又称为后端。 该网站将供我们的内部员工和我们的客户使用。 asmx 服务中有一些方法,如果它们未通过
我在一台服务器 1 上编写了一个 asmx 服务,在另一台服务器 2 上编写了 asp.net/c#。 我要转一个dictionary从 srv1 到 srv2。我读到 Dictionary is n
所以我在 Visual Studio 2010 中创建了一个 Web 服务。为了将它部署到 IIS Web 服务器上,我将 service.asmx、web.config 和 bin 复制到服务器(w
我有以下 ASMX 网络服务: // removed for brevity // namespace AtomicService { [WebService(Namespace = "htt
我在我的应用程序中使用第三方支付网关。支付网关提供商为集成提供了测试 asmx HTTPS URL,它有一些方法。使用 HttpWebRequest 我集成到我的应用程序中。我正在发送 SOAPReq
我正在尝试将国家/地区 Web 服务添加到下拉列表中。我已经添加了 Web 引用并拥有 discomap 和 wsdl 文件。 这是我的代码隐藏: net.webservicex.www.countr
我有一个扩展名为 .asmx 的网络服务,它指向我的网络应用程序中的一个类。添加一些代码以在应用程序启动时输出调试日志后,我可以看到每次用户访问该页面时都会创建一个新的调试日志。 我希望我可以将此 W
我有一个 asmx 服务,这些方法返回具有原始数据类型属性的自定义类。当这些属性为 null 时,它们将被排除在服务返回的 xml 之外。我希望该服务仍返回 xml 中的属性,但没有值。有办法做到这一
我是一名优秀的程序员,十分优秀!