C# “为什么?”;“WCF测试客户端”;抢占我的WCF应用程序,我如何避免它?

C# “为什么?”;“WCF测试客户端”;抢占我的WCF应用程序,我如何避免它?,c#,wcf,rest,C#,Wcf,Rest,我的简单示例wcf服务正在工作,但突然它开始在“wcf测试客户端”对话框中提示我输入端点地址 我记不起改变了什么,从我按F5时弹出浏览器(IE 8)到现在显示“WCF测试客户端”的东西 我不知道在它提供的编辑框中输入什么,所以我尝试了“http://localhost:4841/RestServiceImpl.svc" (http://localhost:4841/RestServiceImpl.svc/xml/123 仍然可以在Visual Studio之外工作) 它接受了(“已成功添加服务”

我的简单示例wcf服务正在工作,但突然它开始在“wcf测试客户端”对话框中提示我输入端点地址

我记不起改变了什么,从我按F5时弹出浏览器(IE 8)到现在显示“WCF测试客户端”的东西

我不知道在它提供的编辑框中输入什么,所以我尝试了“http://localhost:4841/RestServiceImpl.svc" (http://localhost:4841/RestServiceImpl.svc/xml/123 仍然可以在Visual Studio之外工作)

它接受了(“已成功添加服务”显示在对话框的任务栏中),但不执行其他操作;点击“我的服务项目”树视图什么也不做(它没有子项)

更新 如果我尝试直接从IE8运行新操作,我会得到:

“/”应用程序中出现服务器错误。 在契约“IRestServiceImpl”中,有多个方法为“GET”的操作和一个等效于“xml/{platypusId}”的UriTemplate。每个操作都需要一个唯一的UriTemplate和方法组合来明确地分派消息。使用WebGetAttribute或WebInvokeAttribute更改操作的UriTemplate和方法值

这是否意味着我只能有一个接受字符串的xml返回操作?另一个/原始方法是…xml/{id}

更新2 这是代码,但仍然失败:

[ServiceContract]
public interface IRestServiceImpl
{
    [OperationContract(Name="Foo")]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "xml/{id}")]
    string XMLData(string id);

    [OperationContract(Name="FooBar")]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Xml,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "xml/{platypusId, anotherId}")]
    string FirstTrial(string platypusId, string anotherId);

    [OperationContract(Name="FooFooBar")]
    [WebInvoke(Method = "GET",
        ResponseFormat = WebMessageFormat.Json,
        BodyStyle = WebMessageBodyStyle.Wrapped,
        UriTemplate = "json/{id}")]
    string JSONData(string id);
}
//实现(.svc)文件


可以有多个方法接受字符串并返回XML,但不能将它们命名为同一个名称,并使它们都成为GET方法。它怎么知道要调用哪个呢?

可以有多个方法接受字符串并返回XML,但不能将它们命名为同一个名称,并使它们都成为GET方法。它怎么知道您打算调用哪个呢?

对于任何类型的web服务,您都不能有重载方法。如果您指定不同的OperationContract名称,例如

[ServiceContract]
interface IService
{
    [OperationContract(Name="Foo")]
    void Foo();

    [OperationContract(Name="Foobar")]
    void Foo(string bar);

}
但这基本上是将公共签名更改为方法,即使它在接口中的名称相同,所以我通常不会这样做,因为在创建客户机时它可能会更加混乱

更新:

确保在web.config中已将autoformateselectionenabled设置为true

<endpointBehaviors>
    <behavior name="web">
        <webHttp automaticFormatSelectionEnabled="true"/>
    </behavior>
</endpointBehaviors>


对于任何类型的web服务,都不能有重载方法。如果您指定不同的OperationContract名称,例如

[ServiceContract]
interface IService
{
    [OperationContract(Name="Foo")]
    void Foo();

    [OperationContract(Name="Foobar")]
    void Foo(string bar);

}
但这基本上是将公共签名更改为方法,即使它在接口中的名称相同,所以我通常不会这样做,因为在创建客户机时它可能会更加混乱

更新:

确保在web.config中已将autoformateselectionenabled设置为true

<endpointBehaviors>
    <behavior name="web">
        <webHttp automaticFormatSelectionEnabled="true"/>
    </behavior>
</endpointBehaviors>


一开始我没有它们的名字,我认为“string xmlData…”和“string FirstTrial…”区分了它们,但即使在添加了名字之后也失败了。我添加了上面的代码。起初我没有它们的名称,我认为“stringxmldata…”和“stringfirsttrial…”区分了它们,但即使在添加了名称之后,它也失败了。我添加了上面的代码。我添加了它(它刚刚),但我仍然得到:在契约“IRestServiceImpl”中,有多个操作使用方法“get”和一个与“xml/{platypusId,anotherId}”等价的UriTemplate。每个操作都需要一个唯一的UriTemplate和方法组合来明确地分派消息。使用WebGetAttribute或WebInvokeAttribute更改一个操作的UriTemplate和方法值。我添加了它(它刚刚添加),但我仍然得到:在契约“IRestServiceImpl”中,有多个具有方法“get”的操作和一个与“xml/{platypusId,anotherId}”等效的UriTemplate。每个操作都需要一个唯一的UriTemplate和方法组合来明确地分派消息。使用WebGetAttribute或WebInvokeAttribute更改操作的UriTemplate和方法值。