C# jQuery Ajax——当URL包含编码的#&x27;s
我有一个RESTful WCF服务,我正在使用jQuery.ajax()执行PUT to操作。我的一个操作使用5个字符串作为参数。此操作对RDF文档执行任务,因此其中一些参数在字符串中包含(#)。为了适应这种情况,我对这些参数进行了编码 我的问题是,当url包含这些编码参数时,请求将以404失败。出于测试目的,我省略了#,请求正常执行。我不明白为什么编码的#(%23)会导致404。有人能帮我理解出了什么问题吗 行动:C# jQuery Ajax——当URL包含编码的#&x27;s,c#,wcf,web-services,rest,C#,Wcf,Web Services,Rest,我有一个RESTful WCF服务,我正在使用jQuery.ajax()执行PUT to操作。我的一个操作使用5个字符串作为参数。此操作对RDF文档执行任务,因此其中一些参数在字符串中包含(#)。为了适应这种情况,我对这些参数进行了编码 我的问题是,当url包含这些编码参数时,请求将以404失败。出于测试目的,我省略了#,请求正常执行。我不明白为什么编码的#(%23)会导致404。有人能帮我理解出了什么问题吗 行动: [OperationContract] [CorsBehavi
[OperationContract]
[CorsBehavior]
[WebInvoke(Method = "PUT", UriTemplate = "Graphs/{library}/{subjectLocalPart}/{predicateLocalPart}/{objectPart}/{languageCode}")]
ResultMessage CreateTriple(string library, string subjectLocalPart, string predicateLocalPart, string objectPart, string languageCode);
404:
作品:
我将把我的评论变成回答的形式 即使您看到的是URL编码,翻译后的URL如下所示:
http://localhost:1605/Service.svc/Graphs/myLib/123abc/content#HasA/456def#ghik/en-us
因此,您的“页面”实际上是123abc/content
,这就是为什么它是404
要解决此问题,请在WCF服务方法中使用参数和DTO(域对象或类)作为参数。它可以是JSON或name=value
对;我个人会使用JSON
[OperationContract]
[CorsBehavior]
[WebInvoke(Method = "PUT", UriTemplate = "Graphs/{library}/triple")]
ResultMessage CreateTriple(string library, TripleModel model);
[DataContract]
public class TripleModel {
[DataMember]
public string SubjectLocalPart { get; set; }
[DataMember]
public string PredicateLocalPart { get; set; }
[DataMember]
public string ObjectPart { get; set; }
[DataMember]
public string LanguageCode { get; set; }
}
我还没有100%测试过这个,但是使用Fiddler再次检查以确保情况属实。我是根据之前的经验和您给我们的信息猜测的。正如另一个答案所指出的,下面的两个URL基本相同
http://localhost:1605/Service.svc/Graphs/myLib/123abc/content%23HasA/456def%23ghik/en-us
http://localhost:1605/Service.svc/Graphs/myLib/123abc/content#HasA/456def#ghik/en-us
如果要在URI中发送“#”,则需要转义转义版本,以便在服务器上取消转义时,它将是您所期望的:
http://localhost:1605/Service.svc/Graphs/myLib/123abc/content%2523HasA/456def%2523ghik/en-us
我无法评论这会导致问题的原因,但我的解决方案是使用JSON或基于POST的参数,而不是所有基于URL的参数来绕过任何类似的问题。这样你就可以确信,无论通过了什么,它都会被正确地通过。有可能吗?编辑:实际上,原因是浏览器认为您正在访问
123abc/content#hash
。我打赌,如果你在Fiddler中检查了你的请求,你会发现这就是原因。我会看看Fiddler是否按照你的建议显示解码的哈希。谢谢你的意见。。我会试一试。实际上,Fiddler显示了带有编码%23的url。。我将尝试实现一个DTO,就像您在示例中所做的那样。您说如果名称匹配,WCF将把JSON对象的键/值映射到dto??再次感谢DTO的使用似乎让我绕过了这个问题。无论如何,我更喜欢将参数包装到类型化对象中。非常感谢。这是一个很好的解释,我不太明白我自己,考虑到如此显示。