从 jQuery 调用 WCF 服务库时出现问题

2023-11-24

我通过我的 ASPX 站点公开了一个 WCF 服务库,如下所示

[System.ServiceModel.OperationContract]
[System.ServiceModel.Web.WebInvoke(
Method= "POST",
RequestFormat=System.ServiceModel.Web. WebMessageFormat .Json,
ResponseFormat=System.ServiceModel.Web.WebMessageFormat .Json)]
LogonResponse Logon(LogonRequest logonRequest);


[System.Runtime.Serialization.DataContract]
[ Serializable()]
public class LogonRequest
{
[System.Runtime.Serialization.DataMember]
public string EMailAddress;
[System.Runtime.Serialization.DataMember]
public string Password;
}

在我的测试页面中,我可以通过 MS Ajax 调用:-

<asp:ScriptManager ID ="ScriptManager1" runat="server">
<Services>
<asp:ServiceReference Path="~/testService.svc" />
</Services>
</asp:ScriptManager>
.
.
.
function clsLogonRequest(eMailAddress, password) {
this .EMailAddress = eMailAddress;
this .Password = password;
}

function login(eMailAddress, password) {
var LogonRequest = new clsLogonRequest(eMailAddress, password);
name.API.IAPI.Logon(LogonRequest, onSuccess, onFailure);
}

function onSuccess(result) {
$( "#txtSessionId").val(result.SessionId);
$( "#txtUserName").val(result.Name);
$( "#txtUserId").val(result.UserId);
}

工作正常,或者通过 jQuery $.ajax 调用:-

$(document).ready(function() {
$( "#Button1").click(function() {
var LogonRequest = new clsLogonRequest( '*************' , '***********');
$.ajax({
type: "POST",
url: "testService.svc/Logon",
data: "{'logonRequest':" + JSON.stringify(LogonRequest) + "}" ,
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function(msg) {
alert(msg.d);
}
});
});
});

哪个不 - 在 FireBug 下我可以看到 500 Internal Server Error 消息并且异常开始

{"ExceptionDetail":{"HelpLink":null,"InnerException":null,"Message":"The token '\"' was expected but found '''.","StackTrace":"   at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, String res, String arg1, String arg2, String arg3)\u000d\u000a   at System.Xml.XmlExceptionHelper .ThrowTokenExpected(XmlDictionaryReader reader, String expected, Char found)\u000d\u000a   at System.Runtime...

为什么当我明确告诉 jQuery 调用不要传递 XML 时,它似乎正在传递 XML(以及如何阻止它以便尽可能自然地处理来自所有源的调用)?

提前致谢。

EDIT:

感谢您的建议,我看了您所说的,认为我对问题的解释不够清楚。

问题不在于 JSON 没有被发送,它正在发送并且格式正确,我可以从 firebug 中看到这一点。问题在于 WCF 服务库似乎需要 XML,但在收到 JSON 时就会崩溃。

为了确保我没有忽略建议的解决方案,这里是 web.Config 摘录 - 我尝试从行为中删除并从 services/service/endpoint 标记中删除behaviorConfiguration 属性,这只会让整个事情失败无需离开页面。

<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior name ="MyServiceTypeBehaviors ">
<serviceDebug includeExceptionDetailInFaults="true" />
<serviceMetadata httpGetEnabled="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name ="AspNetAjaxBehavior">
<enableWebScript/>
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled= "true " />
<services>
<service name ="test.API.API" behaviorConfiguration = " MyServiceTypeBehaviors">
<endpoint behaviorConfiguration="AspNetAjaxBehavior" binding = " webHttpBinding" contract="test.API.IAPI" />
<endpoint contract ="IMetadataExchange" binding= " mexHttpBinding" address="mex" />
</service>
</services>
</system.serviceModel>

提前致谢


我猜您已经应用了 WebScriptEnablingBehavior (.config 中的enableWebScript 元素)?这会导致所有请求都包装在一个 JSON 对象中,该对象具有一个名为“d”的字段,然后该字段包含一个带有您的命名参数的对象。所以你需要将 jQuery 数据更改为:

data: "{d:{logonRequest:" + JSON.stringify(LogonRequest) + "}}"

或者删除enableWebScript 行为,但是,如果您这样做,则必须改为应用webHttp 行为。现在,不幸的是,默认编码是 XML,并且该行为不提供任何开关来控制整个服务的编码(MSFT 的糟糕设计)。因此,要么您必须通过设置 Request/ResponseFormat 属性将自己与每个方法上的特定编码结合起来,要么我过去处理此问题的方式是创建一个应用相同 WebHttpBehavior 的“EnhancedWebHttpElement”,但提供对其各种属性的配置级别控制。使用此配置的好处是,您现在可以通过不同端点公开相同的 WCF 服务,在一个端点上使用 ASP.NET AJAX 编码,在另一个端点上使用纯 JSON,甚至在另一个端点上使用 POX。

这是代码:

public sealed class EnhancedWebHttpElement : BehaviorExtensionElement
{
    #region Type specific properties

    [ConfigurationProperty("defaultBodyStyle", DefaultValue=WebMessageBodyStyle.Bare)]
    public WebMessageBodyStyle DefaultBodyStyle
    {
        get
        {
            return (WebMessageBodyStyle)this["defaultBodyStyle"];
        }

        set
        {
            this["defaultBodyStyle"] = value;
        }
    }

    [ConfigurationProperty("defaultOutgoingRequestFormat", DefaultValue=WebMessageFormat.Xml)]
    public WebMessageFormat DefaultOutgoingRequestFormat
    {
        get
        {
            return (WebMessageFormat)this["defaultOutgoingRequestFormat"];
        }

        set
        {
            this["defaultOutgoingRequestFormat"] = value;
        }
    }

    [ConfigurationProperty("defaultOutgoingResponseFormat", DefaultValue=WebMessageFormat.Xml)]
    public WebMessageFormat DefaultOutgoingResponseFormat
    {
        get
        {
            return (WebMessageFormat)this["defaultOutgoingResponseFormat"];
        }

        set
        {
            this["defaultOutgoingResponseFormat"] = value;
        }
    }       

    #endregion

    #region Base class overrides

    protected override object CreateBehavior()
    {
        WebHttpBehavior result = new WebHttpBehavior();

        result.DefaultBodyStyle = this.DefaultBodyStyle;
        result.DefaultOutgoingRequestFormat = this.DefaultOutgoingRequestFormat;
        result.DefaultOutgoingResponseFormat = this.DefaultOutgoingResponseFormat;

        return result;
    }

    public override Type BehaviorType
    {
        get
        {
            return typeof(WebHttpBehavior);
        }
    }

    #endregion
}

然后你必须注册它:

<system.serviceModel>
    <extensions>
        <behaviorExtensions>
            <add name="enhancedWebHttp" type="MyNamespace.EnhancedWebHttpElement, MyAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
            </behaviorExtensions>
    </extensions>

然后你像这样使用它:

<behavior name="MyBehavior">
    <enhancedWebHttp defaultOutgoingRequestFormat="JSON" defaultOutgoingResponseFormat="JSON" />
</behavior>

UPDATE:

上面的答案严格适用于 .NET 3.x。如果您使用的是 .NET 4.x 那么您现在可以使用the DefaultOutgoingResponseFormat财产暴露于WebHttpElement来控制这个。更好的是,您可以公开单个端点并设置the new AutomaticFormatSelectionEnabled财产它将根据原始请求的格式以正确的格式进行响应。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 jQuery 调用 WCF 服务库时出现问题 的相关文章

随机推荐

  • T-SQL:当长度 > VarChar(MAX) 时,如何比较 XML 类型的两个变量?

    仅使用 SQL Server 2008 R2 这将位于存储过程中 如何确定 XML 类型的两个变量是否等效 这是我想做的 DECLARE XmlA XML DECLARE XmlB XML SET XmlA Really long Xml
  • xdebug断点失败

    以通常的方式庆祝建立一个新的测试服务器 通过寻求帮助让 xdebug 工作 Server Ubuntu 服务器 16 10 Nginx PHP 7 Xdebug 设置的要求如下http php built com installing xd
  • 在水豚中选择具有多个类的元素

    我正在使用 Selenium 在 Capybara 中编写自动化代码 我的 HTML 中有以下元素 我想在水豚中单击该元素 a href class classA classB click me a 目前 工作方式如下 find class
  • 多重继承会导致虚假的、不明确的虚函数重载

    在这个例子中 类Foo and Bar由图书馆提供 我的课Baz继承两者 struct Foo void do stuff int int struct Bar virtual void do stuff float 0 struct Ba
  • .Net 的开源代理库 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我正在寻找一个开源的 Ne
  • 将 []byte 转换为小/大端有符号整数或浮点数?

    我能够转换 byte转换为无符号整数 a binary LittleEndian Uint16 sampleA b binary BigEndian Uint32 sampleB 这利用了 Go 包中的 Big Endian 和 Littl
  • 我应该关闭JNDI获取的数据源吗?

    更新 显然 Tomcat 从 7 0 11 开始 为您关闭了数据源 因此它在 web 应用程序的 contextDestroyed 中不可用 看 https issues apache org bugzilla show bug cgi i
  • objdump - head ELF - 标志的含义?

    objdump f a out a out file format elf32 i386 architecture i386 flags 0x00000112 EXEC P HAS SYMS D PAGED start address 0x
  • C# 中的流重用

    我一直在尝试一个我认为很简单的想法 我希望能够从某个地方 网站 文件系统 ftp 读取文件 对其执行一些操作 压缩 加密等 然后将其保存在某个地方 可能是文件系统 ftp 或其他任何地方 这是基本的管道设计 我想做的就是读入文件并将其放入
  • 仅通过存储过程强制 INSERT

    使用 SQL Server 2008 是否有一种方法允许仅通过存储过程插入表 如果可以 如何实现 EDIT 最好的方法可能是马丁 史密斯的建议 即使用代替插入扳机 这个问题的直接答案是 marc s 的 GRANT 和 DENY 答案 尽管
  • java中删除和重命名文件

    我在java中创建了一个文件 file1 我读取了该 file1 并对从 file1 读取的数据进行了一些更改 然后将新数据写入另一个文件 file2 现在我需要的是删除以前的文件 file1 并将文件 file2 的名称更改为 file1
  • 创建动态 html 表单

    我想创建一个动态变化的表单 我有一个用于创建项目的表单 包含以下字段 project name project description 并且该项目可以具有任意数量 大于或等于 0 的类别 我想要的是显示一个按钮 让用户可以选择添加另一个类别
  • 删除 Lucene.net 中的所有索引

    我想删除all之前创建的索引 我在用Lucene net 我尝试了以下方法 Term term new Term empty because I want to delete all the indices IndexReader rdr
  • 仅当字符为 Firebird 2.5 上的数字时才转换为 Int

    我有一个在 MySQL 数据库上使用的查询 该查询对结果进行排序 在可能的情况下 当 char 字符串是数字时 将 char 数据库字段转换为整数 因此例如ORDER BY我在 MySQL 上使用的子句是 ORDER BY CASE WHE
  • 如何在刷新页面时抑制重新发布 - ASP.NET MVC

    我正在使用 asp net mvc 构建一个向导 目前 当用户点击下一个 或上一个 时 表单值将被发布到一个操作 该操作执行所需的任何处理 然后呈现下一个视图 我遇到的问题是 如果用户在新视图中点击刷新 他们会被提示重新发布表单值 这会导致
  • 兼容 x86 的英特尔至强融核加速器中是否有 SIMD(SSE / AVX) 指令?

    x86 兼容加速器 MIC Intel Xeon Phi 中是否有 SIMD SSE AVX 指令 http en wikipedia org wiki Xeon Phi 是的 最新一代的英特尔至强融核协处理器 代号 骑士角 缩写 KNC
  • 如何使用伪 CGO 指令在子目录中添加 C 文件作为 go build 的一部分?

    根据文档 go buildwith cgo 将在包的根目录中添加任何 C C 文件作为编译的一部分 有没有办法使用 CGO 指令使给定子目录中的 C C 文件以及根目录中的文件也成为编译的一部分 并不真地 您唯一的选择是将子目录设为另一个
  • Flask 路由模式匹配顺序

    鉴于Flask 路由不是从上到下进行模式匹配的 如何处理以下问题 我有以下路线
  • 如何对并行 numpy 数组进行“压缩排序”?

    如果我有两个并行列表并想按第一个列表中元素的顺序对它们进行排序 这非常简单 gt gt gt a 2 3 1 gt gt gt b 4 6 7 gt gt gt a b zip sorted zip a b gt gt gt print a
  • 从 jQuery 调用 WCF 服务库时出现问题

    我通过我的 ASPX 站点公开了一个 WCF 服务库 如下所示 System ServiceModel OperationContract System ServiceModel Web WebInvoke Method POST Requ