【问题标题】:WCF Service Endpoint doesn't return string after calling it via the Questionmark (?)通过问号(?)调用 WCF 服务端点后,它不返回字符串
【发布时间】:2012-07-15 20:01:45
【问题描述】:

我正在使用 WCF 构建 Web 服务。该服务必须支持 REST。

这是我到目前为止所做的:

我为应用配置了一个baseAddressmex 端点和一个具有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>

我正在建立这样的服务合同:

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

    [OperationContract]
    [WebGet]
    string employees(string queryString);
}

我正在一个单独的类中处理操作合同:

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 方法后被调用。

我这样称呼第一个:

http://localhost:8732/sdata/myApp/myContract/-/employees('3:37')

它工作得很好,给了我 ID 等等。

我这样称呼第二个:

http://localhost:8732/sdata/myApp/myContract/-/employees?where=name eq 'bla'

这就是麻烦的开始。方法员工被调用,但它没有收到任何字符串。我不知道为什么。这是完全相同的代码,就像在那些教程中一样,我只是更改了名称...

有人看到我明显犯的错误吗?非常感谢任何帮助。

还有一件事:我正在使用 .Net 4.0 并在调试器上运行它,这样我就可以通过 firefox rest 客户端调用 url?这是一个服务库项目。

【问题讨论】:

  • 我可能遗漏了一些更基本的东西,但是您实际上没有在这里使用 WCF 数据服务有什么原因吗?示例 URL 看起来您可能正在尝试通过普通 WCF 服务执行 OData。希望这不会给人以光顾的印象,但是 WCF 数据服务与普通的旧 WCF 服务不同,它的主要功能是处理许多标准查询组合,而不需要一堆自定义代码。
  • 这是我尝试设置的第一个网络服务。我按照该视频中的说明进行操作:channel9.msdn.com/Shows/Endpoint/… 我必须遵循协作协议中给出的一组规则。这就是为什么使用它,因为它到目前为止工作。你认为我走错路了吗?
  • 我不确定你是不是走错路了;这对我来说是一个艰难的决定。我可以说的是,OData 和 WCF 数据服务至少适合您上面展示的示例。浏览此页面上的内容可能值得您花 10 分钟时间:odata.org/introduction
  • mm 我不应该使用 odata...但是我使用它的方式真的有什么问题吗?到目前为止效果还不错...
  • 戴上我在微软之前的帽子,我理解为什么会有一个笼统的“不要使用____,因为它来自微软”的声明,但在这种情况下,感觉就像是在重新创造轮子。 (我当然不是要冒犯,只是说明我希望是显而易见的。)我能问一下不使用 OData 的理由是什么,是“不使用 OData”还是“不使用WCF 数据服务”?不使用 OData 肯定有很多正当理由,但您的用例似乎与我所看到的非常吻合。

标签: c#-4.0 rest wcf-data-services


【解决方案1】:

尝试更改参数名称:

string employees(string **where**);

或更改网址:

http://localhost:8732/sdata/myApp/myContract/-/employees?**queryString**=name eq 'bla'

回答您的评论:

  1. 创建一个名为“查询”的参数,然后解析其值。在这种情况下,您负责将查询从字符串解析为真实查询并执行。
  2. 检查“WCF Data Services”。它可以帮助您使用 URL 查询数据。

【讨论】:

  • 如何处理参数,如果我不知道,如果它是 where 或例如 orderBy 查询?或者如果传递了多个参数。比如 ?where=name eq ‘mm’ & orderBy firstname desc 有没有办法读取问号后面的所有内容?
猜你喜欢
  • 2012-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-05
相关资源
最近更新 更多