【问题标题】:Why can't I access my WCF web service with Javascript?为什么我无法使用 Javascript 访问我的 WCF Web 服务?
【发布时间】:2013-01-14 23:06:30
【问题描述】:

我是 AJAX 的新手,我正在尝试通过以下方式访问 WCF Web 服务:

$(function () {
    $('#formNew').submit(function () {
        var datos = {
            "Nombre": $('#nombre').val(),
            "ApellidoP": $('#appP').val(),
            "ApellidoM": $('#appM').val(),
            "UserName": $('#username').val(),
            "Password": $('#password').val(),
        };
        var args = "Data=" + JSON.stringify(datos);
        var url = 'http://127.0.0.1:81/SismosService.svc/usuario/new?' + args;
        alert(url);
        $.ajax({
            type: 'GET',
            url: url,
            success: function (data) {
                alert("Exito " + JSON.stringify(data));
            },
            error: function (data) {
                alert("Error " + JSON.stringify(data));
            }
        });
    });
});

当我填写表单并单击提交按钮时,我在 Firebug 上收到以下错误:

没有

S_ERROR_NOT_AVAILABLE: prompt aborted by user
[Break On This Error]   

throw Components.Exception("prompt aborted by user", Cr.NS_ERROR_NOT_AVAILABLE)

我的网络服务定义如下:

    [WebGet(UriTemplate = "/usuario/new?Data={data}",
    RequestFormat = WebMessageFormat.Json,
    ResponseFormat = WebMessageFormat.Json,
    BodyStyle = WebMessageBodyStyle.Bare)]
    ResponseObject<Usuarios> NewUsuario(string data);

我做错了什么?是我发送参数的方式吗?是我试图访问网络服务的方式吗?感谢您的帮助。

【问题讨论】:

    标签: javascript ajax wcf web-services httprequest


    【解决方案1】:

    JSON.stringify(data) 用于将 javascript 对象转换为 json 表示形式。

    我认为在success\error函数中你需要走另一条路:

     success: function (data) {
                                alert("Exito " + JSON.parse(data));
                              },
     error:   function (data) {
                                alert("Error " + JSON.parse(data));
                              }
    

    (使用 JSON.parse 时,JSON.stringify - 确保在项目中包含 json2.min.js)

    【讨论】:

    • 这不能解决我的问题,没有调用 Web 服务,我将我的 url 变量复制粘贴到选项卡上,它确实可以访问端点,我不知道为什么不访问端点。
    【解决方案2】:

    我通常使用以下配置来启用对我的 WCF 服务的 ajax 调用:

    1) 首先我在 Web.config 中创建一个 JSON 端点行为并将我的服务与它相关联:

    <system.serviceModel>
      <behaviors>
        <endpointBehaviors>
          <behavior name="WebHttpJson">
            <webHttp defaultBodyStyle="Wrapped"
                     defaultOutgoingResponseFormat="Json" />
          </behavior>
        </endpointBehaviors>
      </behaviors>
      <services>
        <service name="MyApp.LoginService">
          <endpoint address=""
                    behaviorConfiguration="WebHttpJson"
                    binding="webHttpBinding"
                    contract="MyApp.LoginService" />
        </service>
      </services>
    </system.serviceModel>
    

    2) 然后我可以像这样简单地定义我的 WCF 服务:

    [ServiceContract]
    public class LoginService
    {
        [OperationContract]
        public void SignIn(string email, string pswd)
        {
            // Check credentials and create session cookie
        }
    }
    

    3) 最后进行如下所示的 jQuery ajax 调用:

    $.ajax({
        contentType: 'application/json; charset=utf-8',
        url: serviceUrl + '/SignIn',
        type: 'POST',
        data: JSON.stringify({
            email: 'john.doe@abc.com', 
            pswd: 'qwerty'
        }),
        success: function () { alert('success!'); },
        error: function () { alert('error!'); }
    });
    

    【讨论】:

    • 我不明白为什么我应该用 OperationContract 属性替换 WebGet 属性,似乎配置每个端点的方法较少。但是,它仍然没有用。我让我的 web.config 看起来像 thisthis 是我添加新用户的方法是如何定义的,this 是我的 javascript 函数如何进行调用。我想我没有清楚地解释自己,由于某种原因我无法通过 ajax 调用端点,我真的很困惑,我是新手。
    • 1) 您必须使用OperationContract Attribute 来指明哪些方法是您的WCF 服务的一部分; 2)您的 Web.Config 看起来不错,如果您的应用程序编译没有错误,它可能是; 3) 删除您当前在 C# 方法中使用的所有属性,其中一些与 Web.Config 冲突; 4)你的ajax调用中的url是错误的,它应该以你的方法名NewUsuario结尾,但它以new结尾; 5) 将您的 args 字符串更改为以 data= 开头(区分大小写)
    • Uri 模板属性让我指定我正在访问的 url,这就是我访问 /usuario/new 而不是 NewUsuario 的原因,如果我通过浏览器访问它就可以工作。无论如何,我删除了所有 WebGet 并尝试访问 127.0.0.1:81/SismosService.svc/GetUsuarios 但它没有工作,它说方法不允许
    • 截至目前我收到此错误 {"readyState":0,"responseText":"","status":0,"statusText":"error"} 并根据@987654325 @这是因为CORS问题,但我已经在我的web.config中添加了CORS兼容性,我不明白为什么我无法访问负责插入、更新或删除的端点
    • 您如何访问有 ajax 调用的网页?如果您像这样“localhost/myapp/mypage.aspx”访问它,那么您的 Web 服务应该使用“localhost”而不是“127.0.0.1”。另一个问题是,您似乎在 WCF 端点使用了不同的端口,我不确定浏览器是否允许这样做。为什么要为方法定义另一个名称,使用自定义端口并使用 GET 而不是 POST?
    猜你喜欢
    • 2020-12-12
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    相关资源
    最近更新 更多