【问题标题】:How do I modify my WCF service to work with ASP.NET pages?如何修改我的 WCF 服务以使用 ASP.NET 页面?
【发布时间】:2011-02-02 06:49:23
【问题描述】:

我创建了一个 WCF 服务 (.NET 3.5),它从数据库中获取数据并返回一个对象列表。它工作得很好。我使用 WCFTestClient 应用程序对其进行了测试,得到了预期的结果。

现在,我尝试创建一个 ASP.NET Web 应用程序并使用该服务。在配置文件中启用<serviceDebug includeExceptionDetailInFaults="true"/> 后,错误消息是“对象引用未设置为对象的实例。”

如何修改服务以使用 ASP.NET?

谢谢!

更新 1 - 我创建了对服务的引用。当我运行我非常基本的测试应用程序时,根据服务默认网页上显示的示例代码,我收到“对象引用未设置为对象实例”消息。

当我使用 Visual Studio 提供的 WCF 测试客户端实用程序时,该服务返回正确的结果。当我尝试使用以下代码时,全部在 page_load 事件中,我得到对象引用消息。

PhoneNumberServiceClient client = new PhoneNumberServiceClient();

// Use the 'client' variable to call operations on the service
List<PhoneNumber> phones = client.GetPhoneNumbers();  

// Always close the client.
client.Close();

我会尝试获取一些额外的调试信息。

【问题讨论】:

  • 我们需要更多信息。您是否添加了对 ASP.net 应用程序的服务引用?您可以在服务器端添加断点并单步执行您的代码以查看发生了什么吗?
  • WCF 服务无需修改即可使用 ASP.NET 页面。还有什么不对劲的。请在客户端上发布您收到的整个异常。在代码周围放置一个 try/catch 块,在 catch 块中,获取 ex.ToString() 的值。把它贴在这里。另外,说说includeExceptionDetailInFaults 为假时会发生什么。

标签: asp.net wcf .net-3.5


【解决方案1】:

您是否尝试过在初始化服务后打开服务:

client.Open();

如果问题仍然存在,则可能是 WCF 方法本身。尝试在您的方法上添加断点并对其进行调试以跟踪错误的原因。您也可以使用分析器。

【讨论】:

  • 用 try-catch 块包装了各种行以进行调试。我能够打开连接,但是应该返回对象列表的方法没有返回任何数据。进一步调查显示我有一个错误的 web.config 文件。
【解决方案2】:

您还必须配置服务以允许结果中出现异常详细信息。 Follow the info in here to make that happen.

我认为您的 ASP.NET 应用程序期望从您尚未设置它提供的服务中捕获某些信息,因此出现空对象错误。

【讨论】:

  • 已启用。这就是对象引用消息的来源。在启用 includeExceptionDetailInFaults 之前,我收到一条通用消息,建议我启用它以获取调试信息。该服务正在返回数据,对此毫无疑问。我在方法上有一个断点,所以我可以看到返回的内容。
【解决方案3】:

我会写这个作为评论,但不知道怎么写,所以我想我会尝试回答。

你提到你使用了内置的测试客户端,但是当你创建你的客户端应用程序(你想用来调用你的新服务的网站)时,你有没有配置它的端点(web.config)来匹配你的 wcf 服务?例如,客户端应用程序使用 wsHttpBinding 端点调用 wcf 服务:

<configuration>
<system.serviceModel>
    <client>
        <endpoint address="http://localhost:8080/ContractorService" binding="wsHttpBinding" contract="ContractorService.IContractorService"
            name="ContractorService_WsHttp">
        </endpoint>
    </client>
</system.serviceModel>

此外,您的服务正在返回一个列表,您添加到客户端的默认服务参考很可能在数组中停止。右键单击您的客户端现在拥有的服务引用并选择配置服务引用,在集合类型的下拉框中,而不是 System.array,选择 System.Collections.Generic.List。

如果您需要有关配置的详细信息,请查看此处http://msdn.microsoft.com/en-us/library/dd936243.aspx

在您的客户端的 Page_Load 方法中放置一个断点,您应该能够单步执行您的客户端代码,并且一旦您调用它的方法,它将自动跳转到您的 wcf 服务中,然后您可以确切地看到它失败的地方。 希望这会有所帮助

【讨论】:

  • 我尝试在列表和数组之间更改集合类型。不去。在这一点上我已经改变了很多东西,我无法得到任何工作。早上,我要重新开始,看看会发生什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-01
  • 2017-12-21
  • 1970-01-01
  • 2012-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多