C# 4.0 WCF服务端点不';t通过问号(?)调用后返回字符串

C# 4.0 WCF服务端点不';t通过问号(?)调用后返回字符串,c#-4.0,rest,wcf-data-services,C# 4.0,Rest,Wcf Data Services,我正在使用WCF构建一个web服务。此服务必须支持REST 以下是我迄今为止所做的: 我用baseAddress、mex端点和一个具有webhttpbinding的附加端点配置了应用程序 以下是服务配置: <service name="ServiceLibrary.Service" behaviorConfiguration="myServiceBehavior"> <endpoint address="" behaviorConfi

我正在使用WCF构建一个web服务。此服务必须支持REST

以下是我迄今为止所做的:

我用
baseAddress
mex
端点和一个具有
webhttpbinding
的附加端点配置了应用程序

以下是服务配置:

<service name="ServiceLibrary.Service" behaviorConfiguration="myServiceBehavior">
    <endpoint 
        address="" 
        behaviorConfiguration="webHttp"
        binding="webHttpBinding" bindingConfiguration="" 
        contract="ServiceLibrary.IEvalService" >
    </endpoint>
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
    <host>
      <baseAddresses>
        <add baseAddress="http://localhost:8732/sdata/myApp/myContract/-/"/>
      </baseAddresses>
    </host>
  </service>
 <serviceBehaviors>
    <behavior name="myServiceBehavior">
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
    <behavior>
      <serviceMetadata httpGetEnabled="true"/>
      <serviceDebug includeExceptionDetailInFaults="false"/>
    </behavior>
  </serviceBehaviors>
  <endpointBehaviors>
    <behavior name="webHttp">
      <webHttp/>
    </behavior>
  </endpointBehaviors>
我在另一个班级处理运营合同:

public class Service : IEvalService
{
    public Atom10ItemFormatter GetEmployeeByPK(string MDNr, string ANNr){return Employee.GetEmployeeByPK(MDNr, ANNr);}
    public string employees(string queryString)
    {
        System.Diagnostics.Debug.WriteLine("Query: " + queryString);
        return queryString;
    }
这两个方法都是在执行get方法后调用的

我这样称呼第一个:

[ServiceContract]
public interface IEvalService
{
    [OperationContract]
    [WebGet(UriTemplate = "/employees('{MDNr}:{ANNr}')")]
    Atom10ItemFormatter GetEmployeeByPK(string MDNr, string ANNr);

    [OperationContract]
    [WebGet]
    string employees(string queryString);
}
http://localhost:8732/sdata/myApp/myContract/-/employees('3:37')
http://localhost:8732/sdata/myApp/myContract/-/employees?where=name eq 'bla'
它工作得很好,给了我身份证等等

第二个我是这样称呼的:

[ServiceContract]
public interface IEvalService
{
    [OperationContract]
    [WebGet(UriTemplate = "/employees('{MDNr}:{ANNr}')")]
    Atom10ItemFormatter GetEmployeeByPK(string MDNr, string ANNr);

    [OperationContract]
    [WebGet]
    string employees(string queryString);
}
http://localhost:8732/sdata/myApp/myContract/-/employees('3:37')
http://localhost:8732/sdata/myApp/myContract/-/employees?where=name eq 'bla'
麻烦就从这里开始。正在调用employees方法,但它没有收到字符串。我不知道为什么。这是完全相同的代码,就像在那些教程中一样,我只是更改了名称

有人看到我明显犯的错误了吗?我真的很感激任何帮助


还有一件事:我正在使用.NET4.0,并且正在通过调试器运行它,以便可以通过FirefoxREST客户端调用URL?这是一个服务库项目

尝试更改参数的名称:

string employees(string **where**);
或更改url:

http://localhost:8732/sdata/myApp/myContract/-/employees?**queryString**=name eq 'bla'
答复你的评论:

  • 创建一个名为“query”的参数,然后解析其值。在本例中,您负责将查询从字符串解析为实际查询并执行它
  • 检查“”字段。它可以帮助您使用URL查询数据

  • 我可能遗漏了一些更基本的东西,但您在这里不实际使用WCF数据服务有什么原因吗?示例URL看起来像是您试图在普通WCF服务上执行OData。希望这不会让人觉得是光顾,但WCF数据服务不同于普通的旧WCF服务,它的主要功能是在不需要大量自定义代码的情况下处理许多标准查询组合。这是我尝试设置的第一个Web服务。我按照这段视频中的说明:我必须遵循一套由合作通信协议给出的规则。这就是为什么要用这个,因为到目前为止它还有效。你认为我走错了路?我不确定你是否走错了路;这对我来说是一个艰难的决定。我可以说的是,OData和WCF数据服务至少符合上面所示的示例。这可能值得你花十分钟的时间来浏览这一页上的内容:。嗯,我不应该使用odata。。。但是我使用这个的方式真的有什么不对吗?到目前为止效果还不错……戴上我之前的微软帽子,我明白为什么会有一条毛毯“不要使用,因为它来自微软”的声明,但在这种情况下,感觉就像是在重新创造轮子。(我当然不是有意冒犯,只是说我希望的是显而易见的。)我能问一下不使用OData背后的理由是什么,是“不使用OData”还是“不使用WCF数据服务”?当然有很多不使用OData的正当理由,但从我所看到的情况来看,您的用例似乎非常匹配。如果我不知道,参数是where还是orderBy查询,我该如何处理?或者如果传递了多个参数。比如?where=name eq'mm'&orderBy firstname desc有没有办法阅读问号后面的所有内容?