测试 WCF 时未列出服务

Posted

技术标签:

【中文标题】测试 WCF 时未列出服务【英文标题】:Service not listed when testing WCF 【发布时间】:2016-02-17 13:21:09 【问题描述】:

我正在尝试为我正在制作的网站测试我的 WCF 服务。我正在使用 jQuery 调用服务 ($.getJSON()),但我不断在网站上收到 Connection Refused Error。

所以我检查了它在部署到计算机时创建的网站,甚至没有列出我的方法“GetData()”。它只是列出了服务本身的名称。一般来说,我对使用 WCF 还是很陌生,所以请怜悯 :') 在 Windows Studio 打开我的服务的测试客户端中,甚至没有列出:

当我尝试添加它时,它说服务已成功添加,但没有任何显示。今天早些时候,我看到了列表中的方法,但由于我搞砸了,不得不删除整个项目。

Web.config 如下所示:

<?xml version="1.0"?>
<configuration>

  <appSettings>
    <add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
  </appSettings>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5"/>
  </system.web>
  <system.serviceModel>
    <behaviors>
      <serviceBehaviors>
        <behavior name="ServiceBehavior">
          <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
          <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
          <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
          <serviceDebug includeExceptionDetailInFaults="true"/>
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="EndpBehavior">
          <webHttp/>
        </behavior>
        <behavior name="enableScriptBehavior">
          <webHttp/>
        </behavior>
      </endpointBehaviors>
    </behaviors>
    <services>
      <service behaviorConfiguration="ServiceBehavior" name="PUendeligWebService.ExampleService">
        <endpoint address="" binding="webHttpBinding" 
                  contract="PUendeligWebService.ExampleServiceInterface" behaviorConfiguration="EndpBehavior"/>
      </service>
    </services>
    <protocolMapping>
        <add binding="basicHttpsBinding" scheme="https" />
    </protocolMapping>    
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
  </system.serviceModel>
  <system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <!--
        To browse web app root directory during debugging, set the value below to true.
        Set to false before deployment to avoid disclosing web app folder information.
      -->
    <directoryBrowse enabled="true"/>
    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*"/>
      </customHeaders>
    </httpProtocol>
  </system.webServer>

</configuration>

界面:

[ServiceContract]
public interface ExampleServiceInterface

    [OperationContract]
    [WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json)]
    String GetData();

    [OperationContract]
    CompositeType GetDataUsingDataContract(CompositeType composite);



[DataContract]
public class CompositeType

    bool boolValue = true;
    string stringValue = "Hello ";

    [DataMember]
    public bool BoolValue
    
        get  return boolValue; 
        set  boolValue = value; 
    

    [DataMember]
    public string StringValue
    
        get  return stringValue; 
        set  stringValue = value; 
    

服务:

public class ExampleService : ExampleServiceInterface

    public String GetData()
    
        Random ran = new Random();
        TestClass[] tc = new TestClass[5];
        TestClass tc1 = new TestClass();
        tc1.TheText = "First Text " + ran.Next();
        tc1.TheOtherText = "First Other Text " + ran.Next();
        TestClass tc2 = new TestClass();
        tc2.TheText = "Second Text " + ran.Next();
        tc2.TheOtherText = "Second Other Text " + ran.Next();
        TestClass tc3 = new TestClass();
        tc3.TheText = "Third Text " + ran.Next();
        tc3.TheOtherText = "Third Other Text " + ran.Next();
        TestClass tc4 = new TestClass();
        tc4.TheText = "Fourth Text " + ran.Next();
        tc4.TheOtherText = "Fourth Other Text " + ran.Next();
        TestClass tc5 = new TestClass();
        tc5.TheText = "Fifth Text " + ran.Next();
        tc5.TheOtherText = "Fifth Other Text " + ran.Next();

        tc[0] = tc1;
        tc[1] = tc2;
        tc[2] = tc3;
        tc[3] = tc4;
        tc[4] = tc5;

        return JsonConvert.SerializeObject(tc);
    

    public CompositeType GetDataUsingDataContract(CompositeType composite)
    
        if (composite == null)
        
            throw new ArgumentNullException("composite");
        
        if (composite.BoolValue)
        
            composite.StringValue += "Suffix";
        
        return composite;
    

最后,为了更好的衡量,这里是我使用的 jQuery:

$(function() 
    $("input:button").click(function() 
        $.getJSON("http://localhost:52535/ExampleService.svc/GetData?callback=?", function(data) 
            alert(data);
        );
    );
);

【问题讨论】:

不是那个特定的端口,没有。我正在使用自行部署到端口的 Netbeans 制作网站。 尝试在 Release 而不是 Debug 中构建解决方案,然后再次尝试。我在尝试 WCF 测试客户端时遇到了类似的问题,当我更改构建模式时它有所帮助,因为它显然需要发布版本中的 .dll 文件。 @urbz 没用。它得到了完全相同的行为:/ 既然你说你必须删除整个项目,那究竟是什么意思?你重建你的VS项目了吗?如果是这样,请仔细检查您的端点配置是否与类型和命名空间完全匹配。您的 web.config 显示 PUendeligWebService。这仍然准确吗? @S.Brentson 这意味着我必须删除整个项目,然后使用 Visual Studio 向导创建一个新项目:) 是的,名称是正确的。 【参考方案1】:

(想写评论,但是写的太长了……) 要创建一个简单的休息服务,您必须执行几个步骤:

1) 定义服务方法和接口:

namespace CoreAuroraService.Services

    [DataContract]
    public class Patient 
    
        [DataMember]
        public String LastNameget;set;

        [DataMember]
        public string FirstNameget;set;
    

    [ServiceContract]
    public interface IPatientService
    
        [OperationContract]
        [WebGet(UriTemplate = "/GetAllPatients", ResponseFormat = WebMessageFormat.Json)]
        List<Patient> GetAllPatients();

        [OperationContract]
        [WebInvoke(UriTemplate = "/Create", Method = "POST", ResponseFormat = WebMessageFormat.Json)]
        bool CreatePatient();


        [OperationContract]
        [WebInvoke(UriTemplate = "/Update", Method = "PUT", ResponseFormat = WebMessageFormat.Json)]
        bool UpdatePatient(Guid patientGuid);


        [OperationContract]
        [WebInvoke(UriTemplate = "/Delete", Method = "DELETE", ResponseFormat = WebMessageFormat.Json)]
        bool DeletePatient(Guid patientGuid);
    

    public class PatientService : IPatientService
    
        public List<Patient> GetAllPatients()
        
            var patient = new Patient()  FirstName = "Jeem", LastName = "Street" ;
            var patients = new List<Patient>  patient ;
            return patients;
        

        public bool CreatePatient()
        
            // TODO: Implement the logic of the method here
            return true;
        

        public bool UpdatePatient(Guid patientGuid)
        
            // TODO: Implement the logic of the method here
            return true;
        

        public bool DeletePatient(Guid patientGuid)
        
            // TODO: Implement the logic of the method here
            return true;
        
    

2) 现在您必须定义服务的行为。为此,您必须更改服务项目中的配置文件。在此文件中,您必须定义服务行为和其他设置,以使您的服务保持安静。为此,将下一个代码粘贴到 serviceModel 块中:

<services>
  <service name="CoreAuroraService.Services.PatientService">
    <endpoint address="" behaviorConfiguration="rest" binding="webHttpBinding" bindingConfiguration="maxStream" contract="CoreAuroraService.Services.IPatientService">
      <identity>
        <dns value="localhost"/>
      </identity>
    </endpoint>
    <host>
      <baseAddresses>
        <add baseAddress="https://localhost/Services/PatientService.svc"/>
      </baseAddresses>
    </host>
  </service>
</services>

<behaviors>
  <endpointBehaviors>
    <behavior name="rest">
      <webHttp helpEnabled="true"/>
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior>
      <!-- To avoid disclosing metadata information, set the values below to false before deployment -->
      <serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
      <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
      <serviceDebug includeExceptionDetailInFaults="true"/>
    </behavior>
  </serviceBehaviors>
</behaviors>

3) 现在让我们编写一个方法,从 javascript 调用我们的服务:

<script>
    function GetP() 
        // Now I need to send cross domain request to the service because my services hosted in another project
        // Tested in IE 11
        var url = "http://localhost:29358/Services/PatientService.svc/GetAllPatients";
        $.ajax(
            type: 'GET',
            dataType: "text",
            url: url,
            success: function (responseData, textStatus, jqXHR) 
                console.log("in");
                var data = JSON.parse(responseData);
                console.log(data);
            ,
            error: function (responseData, textStatus, errorThrown) 
                alert('POST failed.');
            
        );
    
</script>

【讨论】:

看起来不错。我会接受它作为这个答案:)【参考方案2】:

首先,如果您从这里更改 webInvoke 属性会更好:

[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json)]
String GetData();

到这里:

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json, UriTemplate="/getData")]
String GetData();

比运行您的服务并通过编写如下网址在浏览器中打开它:

http://host_name:port_number/service_name.svc/getData

之后你应该得到你的数据(如果everythink没问题的话)

当我尝试添加它时,它说服务成功 添加,但没有显示。今天早些时候我看到了列表中的方法 但因为我搞砸了,不得不删除整个项目。

我认为这是因为您在 Web 配置文件中设置的 webHttpBinding(使您的服务变得安静)而发生的。通常测试客户端为 SOAP 服务生成调用方法。

【讨论】:

当我使用localhost:52535/ExampleService.svc/GetData 访问该方法时,我看到一个页面显示“不允许使用该方法”。我将如何更改我的配置以便我可以返回到 SOAP 服务而不是 REST?使用该方法时,该网站还给我一个 405 错误。 我取得了一些进展。我进入了我的 WebInvoke 属性并添加了“Method = “*””,现在它可以工作了。现在我只需要弄清楚如何解析我收到的 JSON 字符串。 为此,您可以使用这里解释的 json.parse() 方法mkyong.com/javascript/how-to-access-json-object-in-javascript 另外我想知道您需要哪种类型的服务 REST 或 SOAP ? 真正最快的那个。我以任何方式将 C# Web 服务中的任何数据转换为 JSON 字符串,并且我希望也将 JSON 返回到 Web 服务。它用于读取信息并将信息写入 Web 服务与之通信的数据库。

以上是关于测试 WCF 时未列出服务的主要内容,如果未能解决你的问题,请参考以下文章

如何对 WCF 服务进行单元测试?

Visual Studio 2015 中的 WCF 测试客户端在哪里

当 url 段为 json 字符串时,访问 WCF Rest 服务 (WebGet) 时未找到 404

从同一主机上的子域访问时未找到 WCF 错误

从 Jquery 调用的 WCF:不允许的方法

测试 WCF Web 服务?