2011-04-21 176 views
0

我正在尝试使用JQuery与Json调用Ajax调用一个Web服务,这是一个传递并调用另一个Web服务。如果我不使用ajax,这将起作用,直接作为对后端服务的ajax调用,但不作为ajax调用传递服务。我的问题是如何获得一个Ajax通过web服务传递到webservice工作?jQuery Ajax与Json调用WCF服务传递到WCF服务

这是我的代码至今:

[ServiceContract] 
public interface IService1 
{ 

    [OperationContract] 
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.WrappedRequest, ResponseFormat = WebMessageFormat.Json, RequestFormat = WebMessageFormat.Json)] 
    string GetData(int value); 
    } 

web服务背后:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Service1 : IService1 
{ 
    public string GetData(int value) 
    { 
     return string.Format("You entered: {0}", value); 
    } 
} 

直通服务:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] 
public class Service2 : IService1 
{ 
    public string GetData(int value) 
    { 
     var service = new ServiceReference1.Service1Client("clientContractStuff"); 
     var testString = service.GetData(value); 
     return testString; 
    } 
} 

页后面的代码:

public partial class WebUserControl1 : System.Web.UI.UserControl 
{ 
    protected void CodeBehindWcf(object sender, EventArgs e) 
    { 
     var service = new ServiceReference1.Service1Client("clientContractStuff"); 
     var testString = service.GetData(5); 
     TextBox1.Text = testString; 
    } 

    protected void CodeBehindWcfUsingService2(object sender, EventArgs e) 
    { 
     var service = new Service2(); 
     var testString = service.GetData(5); 
     TextBox2.Text = testString; 
    } 
} 

JavaScript和HTML:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" 
    Inherits="WcfService1.WebUserControl1" %> 
<script type="text/javascript" src="Scripts/jquery-1.4.4-vsdoc.js"></script> 
<script type="text/javascript" src="Scripts/jquery-1.4.4.min.js"></script> 
<script type="text/javascript"> 
    function ajaxService2() { 
     serviceUrl = "Service2.svc/GetData"; 
     $.ajax({ 
      type: "POST", 
      url: serviceUrl, 
      data: "{\"value\":\"1\"}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (transport) { 
       var string = transport; 
       $("#Text2").val(string); 
      } 
     }); 
    } 

    function ajaxService1() { 
     serviceUrl = "Service1.svc/GetData"; 
     $.ajax({ 
      type: "POST", 
      url: serviceUrl, 
      data: "{\"value\":\"2\"}", 
      contentType: "application/json; charset=utf-8", 
      dataType: "json", 
      success: function (transport) { 
       var string = transport; 
       $("#Text1").val(string); 
      } 
     }); 
    } 
</script> 
<p> 
    <input id="Button1" type="button" value="Ajax call service 1" onclick="ajaxService1()" /> 
    <input id="Text1" name="Text1" type="text" /></p> 
<p> 
    <input id="Button2" type="button" value="Ajax call service 2" onclick="ajaxService2()" /> 
    <input id="Text2" name="Text2" type="text" /></p> 
<p> 
    <asp:Button ID="Button3" runat="server" Text="Code Behind" OnClick="CodeBehindWcf" /> 
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox></p> 
<p> 
    <asp:Button ID="Button4" runat="server" Text="Code Behind Use Service 2" OnClick="CodeBehindWcfUsingService2" /> 
    <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox></p> 

一切正常,除了按键2和ajaxService2功能。这会引发错误:'远程服务器返回了意外的响应:(400)错误的请求。'

+0

顺便说一句,它是“jQuery”。 – 2011-04-21 00:19:25

回答

0

为了使用Ajax,必须使用webhttpbinding作为传递web服务的端点,并且我假设也将用于后端服务。

综观自动生成的服务代码“服务引用\ Reference.cs”:

public interface IService1 { 

    [System.ServiceModel.OperationContractAttribute(Action="http://tempuri.org/IService1/GetData", ReplyAction="http://tempuri.org/IService1/GetDataResponse")] 
    string GetData(int value); 
} 

可以很容易地看到它的产生依据SOAP和REST不是代码。由于webhttpbinding是一个REST绑定,它不起作用。我改变了后端服务以使用basichttpbinding,并且一切正常。

0

Service2.GetData您初始化Service2的客户端,它再次调用Service2.GetData