测试 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 时未列出服务的主要内容,如果未能解决你的问题,请参考以下文章
Visual Studio 2015 中的 WCF 测试客户端在哪里