从 jQuery 调用 ASP.NET 4.0 WCF 服务会产生 400 Bad Request
Posted
技术标签:
【中文标题】从 jQuery 调用 ASP.NET 4.0 WCF 服务会产生 400 Bad Request【英文标题】:Calling an ASP.NET 4.0 WCF service from jQuery yields 400 Bad Request 【发布时间】:2011-08-01 13:41:54 【问题描述】:我知道这个问题似乎已经发布了很多次,但我几乎阅读了所有这些(互联网上的大部分教程),但我仍然无法理解我做错了什么。
我试图在一个网站中实现我们正在开发一个由 jQuery 脚本使用的 WCF Web 服务,但是在执行 AJAX 请求时我不断收到400 Bad Request
,我开始失去希望了。
请注意,我是 WCF 的新手,而且我只是通过在线教程才形成自己的,所以我完全有可能忽略或搞砸了一些事情。
我试过但没有帮助的问题:
WCF Service returns 400 Bad Request uploading large xml to WCF REST service -> 400 Bad request 400 Bad Request HTTP Response using a WCF POST via JQuery Error 400 (Bad Request) with WCF Tutorial? Why does my C# client, POSTing to my WCF REST service, return (400) Bad Request?我阅读的外部资源无济于事:
http://www.west-wind.com/weblog/posts/324917.aspx http://www.c-sharpcorner.com/UploadFile/sridhar_subra/116/ http://learningbyfailing.com/2008/05/calling-wcf-from-jquery-using-parameters/ http://iainjmitchell.com/blog/?p=97 许多其他...我也尝试创建一个新的解决方案,只有一个页面和服务,以排除干扰,但我仍然遇到同样的问题。在这里你可以找到代码:
IService.cs
namespace WebService
using System;
using System.ServiceModel;
using System.ServiceModel.Web;
[ServiceContract(Name = "Service", Namespace = "WebService")]
public interface IService
[OperationContract]
[WebInvoke(BodyStyle = WebMessageBodyStyle.Wrapped, Method = "POST", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
String Test();
Service.svc.cs
namespace WebService
using System;
public class Service : IService
public String Test()
return "Hello, world.";
Default.aspx
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebService.Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.5.2/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function ()
$("#doAjax").click(function (event)
event.preventDefault();
jQuery.ajax(
contentType: "application/json"
, dataType: "text"
, error: function (jqXHR, textStatus, errorThrown)
console.group("AJAX error:");
console.debug(jqXHR);
console.debug(textStatus);
console.groupEnd();
, processData: false
, success: function (data, textStatus, jqXHR)
console.group("AJAX success:");
console.debug(data);
console.debug(textStatus);
console.debug(jqXHR);
console.groupEnd();
, type: "post"
, url: "/Service.svc/Test"
);
);
);
</script>
<title>WebService</title>
</head>
<body>
<form runat="server">
<h1><%= this.Page.Title %></h1>
<p><input id="doAjax" type="button" value="Run" /></p>
</form>
</body>
</html>
Web.config
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<bindings />
<client />
<behaviors>
<endpointBehaviors>
<behavior name="Behavior">
<webHttp />
</behavior>
</endpointBehaviors>
<serviceBehaviors>
<behavior name="">
<serviceMetadata httpGetEnabled="true" />
<serviceDebug includeExceptionDetailInFaults="false" />
</behavior>
</serviceBehaviors>
</behaviors>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
<services>
<service name="Service">
<endpoint behaviorConfiguration="Behavior" binding="webHttpBinding" contract="WebService.IService" />
</service>
</services>
</system.serviceModel>
</configuration>
【问题讨论】:
你想出这个问题的答案了吗?我遇到了同样的问题,找不到解决方案... :( @NaveedButt 不,我后来转到其他项目。试试下面的答案,如果你能做到,请发布答案/评论,以便其他人知道该怎么做。 我可以通过在页面中放置一个 div 并将其 html 设置为 jqXHR 来查看有关错误的更多详细信息,以防引发错误。这样我就得到了更好的输出。当我找到一个 IA 时,我会在这里发布一个解决方案。 我发现了错误,它与我的javascript有关。我用来调用服务的jquery.ajax
方法出现了一些错误。
【参考方案1】:
服务名称必须是完全限定的。试试看:<service name="WebService.Service">
【讨论】:
【参考方案2】:嘿!我遇到了同样的问题(......再次)但最终想通了并让它正常工作。
现在这是我自己的例子,但因为它对我有用,希望它也对你有用......我忘记的关键行在我的 $ajax 命令中:
contentType: "application/json; charset=utf-8"
祝你好运:)我在这个问题上花了半天时间。
界面:
[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json)]
int CreateMilestone(Milestone Input);
类:
[DataContract]
public class Milestone
[DataMember]
public string Name get; set;
[DataMember]
public string Date get; set;
[DataMember]
public int Risk get; set;
[DataMember]
public int Complexity get; set;
方法:
public int CreateMilestone(Milestone Input)
return 0;
jquery:
$("#btnSubmit").click(function ()
if ($.trim($("#txtName").val()) == "")
$("#dName").effect("highlight", 500);
else
var date = $("#txtDate").datepicker("getDate");
var data =
Name: $("#txtName").val(),
Date: (date.getMonth() + 1) + "-" + date.getDate() + "-" + date.getFullYear(),
Risk: parseInt($("#sRisk").text()),
Complexity: parseInt($("#sComplexity").text())
;
var jsondata = JSON.stringify(data);
$.ajax(
type: "POST",
async: false,
url: 'Services/ProjectService.svc/CreateMilestone',
contentType: "application/json; charset=utf-8",
data: jsondata,
dataType: "json",
success: function (msg)
,
error: function (XMLHttpRequest, textStatus, errorThrown)
// alert(XMLHttpRequest.status);
// alert(XMLHttpRequest.responseText);
);
);
【讨论】:
以上是关于从 jQuery 调用 ASP.NET 4.0 WCF 服务会产生 400 Bad Request的主要内容,如果未能解决你的问题,请参考以下文章
从 JQuery 调用的 ASP.Net [WebMethod] 获取更好的错误消息
扩展从 JQuery 调用 Web 服务时从 ASP.NET 引发的异常
如何使用 jQuery 和 ASP.NET MVC 从 AJAX 调用返回错误消息?
通过调用 ASP.NET 按钮单击从 jQuery 模态对话框回发
如何使用 jQuery Ajax 调用从 ASP.NET Web Api 下载 CSV 文件
将 html 标记从 jquery 发布调用发送到 asp.net 页面时,从客户端检测到潜在危险的 Request.QueryString 值