我是WCF的新手,所以我认为这是非常基本的。我有一个简单的方法,返回一个“订单”对象。但是,当我应用
时,它在使用默认XML时工作得很好ResponseFormat = WebMessageFormat.Json
属性,无法返回JSON
。代码成功执行并命中返回行,但随后立即再次调用该方法,最后在浏览器返回错误之前第三次调用与localhost的连接已被中断。
当我删除ResponseFormat = WebMessageFormat.Json
时,调用该方法并返回XML。不确定我是否缺少JSON。
IProductSales.cs
namespace ProductsSalesService
{
[ServiceContract(Name = "ProductsSales")]
public interface IProductsSales
{
[OperationContract]
[WebGet(UriTemplate = "Orders/{orderID}", ResponseFormat = WebMessageFormat.Json)]
[Description("Returns the details of an order")]
SalesOrderHeader GetOrder(string orderID);
}
}
ProductSales
public SalesOrderHeader GetOrder(string orderID)
{
SalesOrderHeader header = null;
try
{
int id = Convert.ToInt32(orderID);
AdventureWorksEntities database = new AdventureWorksEntities();
header = (from order in database.SalesOrderHeaders
where order.SalesOrderID == id
select order).FirstOrDefault();
}
catch
{
throw new WebFaultException(HttpStatusCode.BadRequest);
}
return header;
}
我正在处理WCF一本书中的示例,因此他们让我构建了一个小型控制台应用程序作为主机,因此这是我为主机客户端提供的app.config文件。
<?xml version="1.0"?>
<configuration>
<connectionStrings>
<add name="AdventureWorksEntities" connectionString="metadata=res://*/ProductsSalesModel.csdl|res://*/ProductsSalesModel.ssdl|res://*/ProductsSalesModel.msl;provider=System.Data.SqlClient;provider connection string="Data Source=BINGBONG;Initial Catalog=AdventureWorks;Integrated Security=True;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
</connectionStrings>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup><system.serviceModel>
<services>
<service name="ProductsSalesService.ProductsSales">
<endpoint address="http://localhost:8000/Sales" binding="webHttpBinding"
bindingConfiguration="" name="ProductsSalesService.ProductsSales"
contract="ProductsSalesService.IProductsSales" />
</service>
</services>
</system.serviceModel>
</configuration>
最后,这只是主机客户端代码。
public class Program
{
static void Main(string[] args)
{
WebServiceHost host = new WebServiceHost(typeof(ProductsSalesService.ProductsSales));
host.Open();
Console.WriteLine("Service running");
Console.WriteLine("Press ENTER to stop the service");
Console.ReadLine();
host.Close();
}
}
因此,当我转到http://localhost:8000/Sales/Orders/43659
提取订单时,它会点击三次,并且该页面会在Chrome中取消,并显示以下错误:
此网页不可用与localhost的连接是 中断。以下是一些建议:稍后重新加载此网页。 检查您的Internet连接。重启任何路由器,调制解调器或其他 您可能正在使用的网络设备。允许添加Google Chrome 在防火墙或防病毒软件的设置中编程。如果是 已经是一个允许的程序,尝试从列表中删除它 允许的程序并再次添加。如果您使用代理服务器, 检查您的代理设置或联系您的网络管理员 确保代理服务器正常工作。如果你不相信你应该 使用代理服务器,调整代理设置:转到扳手 菜单&gt;设置&gt;显示高级设置...&gt;更改代理设置...
LAN设置并取消选中“为LAN使用代理服务器”复选框。错误101(net :: ERR_CONNECTION_RESET):连接是 复位。
如果删除WebMessageFormat.Json
,一切正常!
感谢您的帮助!
答案 0 :(得分:5)
对于初学者来说,尝试WCF跟踪/记录以查看它是否对事物有所了解。
将它放在服务器的配置文件中(<configuration>
元素内的某处): -
<system.diagnostics>
<sources>
<source name="System.ServiceModel" switchValue="Error" propagateActivity="true">
<listeners>
<add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\Temp\server.svclog"/>
</listeners>
</source>
<source name="System.ServiceModel.MessageLogging">
<listeners>
<add name="messages"
type="System.Diagnostics.XmlWriterTraceListener"
initializeData="C:\Temp\server_messages.svclog" />
</listeners>
</source>
</sources>
</system.diagnostics>
并将其放在<system.serviceModel>
元素中: -
<diagnostics>
<messageLogging
logEntireMessage="true"
logMalformedMessages="false"
logMessagesAtServiceLevel="true"
logMessagesAtTransportLevel="false"
maxMessagesToLog="3000"
maxSizeOfMessageToLog="2000"/>
</diagnostics>
尝试再次访问您的服务并检查此(希望)生成的.svclog文件以获取线索。这些文件将在“服务跟踪查看器”工具中打开 - 如果没有,可以从MS下载(我认为是Win SDK的一部分)。
答案 1 :(得分:1)
虽然我的错实际上是无关的,但这是我在查看我的问题时发现的第一篇文章,即我的服务失败并且我看到错误连接已被中断。
我的错是因为我从WebGet
方法输出的类具有DataContract
属性的属性,但我没有为每个属性添加Set
个访问者这一事实(因为我认为它们只是输出而我没有看到这一点。)
将跟踪添加到我的配置文件中很快就发现错误是没有Set
个访问者,因此我为每个private set
属性添加了DataContract
个访问者,现在所有访问者都在预期
我已在此处添加此内容,以防其他人遵循相同的搜索路径并遇到相同的问题。
答案 2 :(得分:0)
这行代码将构建服务主机而不考虑配置,因此您将拥有Service但它将侦听不同的URL。
WebServiceHost host = new WebServiceHost(typeof(ProductsSalesService.ProductsSales));
添加基地址new WebServiceHost
以及以下代码:
WebChannelFactory<ProductsSalesService.IProductsSales> cf =
new WebChannelFactory<ProductsSalesService.IProductsSales>("ProductsSalesService.ProductsSales");
ProductsSalesService.IProductsSales channel = cf.CreateChannel();
请在此处查看完整代码 - http://msdn.microsoft.com/en-us/library/bb919583