jQuery Ajax с вызовом Json к службе WCF, сквозной к службе WCF - PullRequest
0 голосов
/ 21 апреля 2011

Я пытаюсь использовать вызов jQuery Ajax с Json для вызова веб-сервиса, который является сквозным и вызывает другой веб-сервис.Это работает, если я не использую ajax, работает как ajax-вызов к бэкэнд-сервису напрямую, но не работает как ajax-вызов для сквозного сервиса.Мой вопрос заключается в том, как заставить работать ajax для передачи через веб-сервис в веб-сервис?

У меня есть такой код:

[ServiceContract]
public interface IService1
{

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

За веб-сервисом:

[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) Неверный запрос.»

Ответы [ 2 ]

0 голосов
/ 09 февраля 2012

В Service2.GetData вы инициализируете клиента вашего Service2, который снова вызывает Service2.GetData.

0 голосов
/ 21 апреля 2011

Чтобы использовать Ajax, webhttpbinding должен использоваться для конечной точки сквозного веб-сервиса, и я предположил, что он также будет использоваться для серверной службы.

Просмотр автоматически сгенерированного справочного кода службы в 'Service References \ 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, и все работает как надо.

...