18

通过 ajax json 调用 WCF 服务时,我得到了上述响应。我的调用代码是:

<script type="text/javascript">
    $(document).ready(function () {
        $.ajax
        ({
            type: "POST",
            contentType: "application/json; charset=utf-8",
            url: "http://localhost:90/WebServices/UserService.svc/Calculate",
            data: "{}",
            timeout: 10000,
            dataType: "json",
            success: function (response) {
                alert(response)
            },
            error: function (xhr, ajaxOptions, thrownError) {
                alert(xhr.statusText);
                alert(thrownError);
            }
        });
    });
</script>

我的服务是:

[ServiceContract]
public interface IUserService
{
    [OperationContract]
    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json
     )]
    Answer Calculate();
}

[DataContract]
public class Answer
{
    [DataMember]
    public string answer { get; set; }
}

我的方法是:

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class UserService : IUserService
{
    public Answer Calculate()
    {
        Answer answer = new Answer();
        answer.answer="Hello World";
        return answer;
    }
}

我一直在与之斗争一段时间,我看到其他人也遇到过同样类型的问题,我尝试了所有的建议,但仍然没有任何效果。

问题出在哪里?我该如何解决?

4

3 回答 3

22

我猜这里是因为你没有展示你是如何定义你的端点的,但我很确定是这样的。您的端点不是为 Web 消费定义的 - 它可能使用basicHttpBinding. 要通过 jQuery(或一般的其他 web/REST 客户端)使用端点,您需要使用 定义端点WebHttpBinding,并将 应用于WebHttpBehavior它。

有多种方法可以正确定义端点。最简单的方法是WebServiceHostFactory在 .svc 文件中使用:

用户服务.svc

<%@ ServiceHost Language="C#" Debug="true" Service="YourNamespace.UserService"
                Factory="System.ServiceModel.Activation.WebServiceHostFactory" %>
于 2013-01-18T17:14:35.857 回答
1

对于通过搜索到达这里的任何人:'content type'application/json; charset=utf-8' 不是预期的类型 'text/xml; 字符集=utf-8'

在我的案例中,由于构建和运行没有适当属性的服务而导致了类似的错误。当我尝试在客户端应用程序中更新服务引用时收到此错误消息。当我将“[DataContract]”和“[DataMember]”属性正确应用到我的自定义类时,它得到了解决。

编辑:如果您的服务已设置并正常工作,然后在您编辑后它中断了,这很可能适用。

于 2016-07-18T22:05:54.663 回答
1

这是一个很老的问题,但我想在@carlosfigueira 的回答中添加一些信息。

1. 指定Factoryin.svc与指定 a <service>inweb.config

在文件中指定 a的替代方法是Factory.svc文件中指定 a 。这在许多其他答案(例如这个)中都有解释,所以我不会重复它们,但值得在这里复制另一个@carlosfigueira答案<service>web.config

如果您未在 .svc 文件中指定任何工厂,则所有端点都将来自 web.config 文件 - WCF 将尝试查找 其属性与服务类的完全限定名称<system.serviceModel / service>匹配的元素。如果找不到,那么它将添加一个默认端点(使用,除非您更改了默认映射)。namebasicHttpBinding

并且要清楚:完全限定的名称应该包括命名空间。因此,如果有以下内容,它将是MyWebServices.ExampleWebService

namespace MyWebServices
{
    [ServiceContract]
    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]
    public class ExampleWebService
    {
        [OperationContract]
        [WebInvoke(Method = "POST",
            BodyStyle = WebMessageBodyStyle.Bare,
            ResponseFormat = WebMessageFormat.Json,
            RequestFormat = WebMessageFormat.Json)]
        public string DoWork(DoWorkRequest request)
        {
            return "success!";
        }
    }
}


2. 在 localhost 上调用时出现“无法处理消息...”

我在尝试从 Visual Studio 在 localhost 上运行 ajax 调用时遇到了这个问题,并得到了错误消息,即这个问题的标题,所以我想列出解决它所需的步骤:

  1. 如上所述,要么在 中添加一个,Factory要么.svcweb.config.
  2. 在 Visual Studio 中,右键单击您的.html文件,然后选择“在浏览器中查看”。您的默认浏览器会打开,如果是 Chrome,则 url 将是,例如,localhost:51667/test.html(实际上是http://localhost:51667/test.html)。
  3. 您现在可以触发您的 ajax 调用,并希望您能成功获得 Web 服务响应。
  4. 如果您想调试您的 Web 服务,那么:
    在 Visual Studio 中,确保 Web 服务的项目设置为启动项目,然后按 F5。这将启动 WCF 测试客户端窗口,但您可以忽略它并触发您的 ajax 请求。
于 2019-09-03T22:44:04.627 回答