jQuery Ajax - 当URL包含编码#时,为什么我会得到404?

时间:2012-01-06 22:31:38

标签: c# wcf web-services rest

我有一个RESTful WCF服务,我正在使用jQuery执行PUT.ajax()我的一个操作需要5个字符串作为参数。此操作在RDF文档上执行任务,因此其中一些参数包括字符串中的(#)。为了适应这个,我正在编码这些参数。

我的问题是当url包含这些编码参数时,请求失败并带有404.出于测试目的,我省略了#并且请求正常执行。我不明白为什么编码#(%23)导致404.有人能帮我理解什么是错的吗?

操作:

    [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:

  

http://localhost:1605/Service.svc/Graphs/myLib/123abc/content%23HasA/456def%23ghik/en-us

使用:

http://localhost:1605/Service.svc/Graphs/myLib/123abc/contentHasA/456defghik/en-us

2 个答案:

答案 0 :(得分:1)

正如另一个答案所指出的,下面的两个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

答案 1 :(得分:0)

我会将我的评论写成答案。

即使它显示为URL编码,翻译的URL如下:

http://localhost:1605/Service.svc/Graphs/myLib/123abc/content#HasA/456def#ghik/en-us

因此,您的“页面”实际上是123abc/content,这就是为什么它是404。

要解决此问题,请使用参数和DTO(域对象或类)作为WCF服务方法中的参数。它可以是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仔细检查以确保是这种情况。我猜是基于先前的经验和你给我们的东西。