【问题标题】:WCF Service with ASP.Net带有 ASP.Net 的 WCF 服务
【发布时间】:2011-11-05 21:52:24
【问题描述】:

我是 WCF 的新手。

我在下面编写了以下服务,运行良好。然后我配置了 IIS,并通过浏览器http://localhost/WCF_Entity_SVC/ProductService.svc 运行服务,运行良好。我创建了一个 ASP.Net 网页并使用 url 添加了一个服务引用。当我运行 ASP 页面时,我收到一个内部错误。任何帮助表示赞赏。

public class ProductService : IProductService
    {
        public Product GetProduct(int id)
        {
            NorthwindEntities context = new NorthwindEntities();
            var productEntity = (from p
                                 in context.ProductEntities
                                 where p.ProductID == id
                                 select p).FirstOrDefault();
            if (productEntity != null)
                return TranslateProductEntityToProduct(productEntity);
            else
                throw new Exception("Invalid product id");
        }
        private Product TranslateProductEntityToProduct(
              ProductEntity productEntity)
        {
            Product product = new Product();
            product.ProductID = productEntity.ProductID;
            product.ProductName = productEntity.ProductName;
            product.QuantityPerUnit = productEntity.QuantityPerUnit;
            product.UnitPrice = (decimal)productEntity.UnitPrice;
            product.Discontinued = productEntity.Discontinued;
            return product;
        }
    }

ASP 代码

 public partial class _Default : System.Web.UI.Page
    {
        myService.ProductServiceClient objService = new ProductServiceClient();

        protected void Page_Load(object sender, EventArgs e)
        {
           var results = objService.GetProduct(45);   //debug shows internal error
           dgResult.DataSource = results;
           dgResult.DataBind();

        }
    }

向 webconfig 添加调试显示以下错误:

The underlying provider failed on Open. 

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

        Exception Details: System.ServiceModel.FaultException`1[[System.ServiceModel.ExceptionDetail, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]: The underlying provider failed on Open.

        Source Error: 


        Line 159:        
        Line 160:        public ASPWFC.myService.Product GetProduct(int id) {
        Line 161:            return base.Channel.GetProduct(id);
        Line 162:        }
        Line 163:    }

    Source File: D:\My Documents\Visual Studio 2010\Projects\wcf\WCF_Entity\ASPWFC\Service References\myService\Reference.cs    Line: 161 

    Stack Trace: 


    [FaultException`1: The underlying provider failed on Open.]
       System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) +9464367
       System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type) +345
       ASPWFC.myService.IProductService.GetProduct(Int32 id) +0
       ASPWFC.myService.ProductServiceClient.GetProduct(Int32 id) in D:\My Documents\Visual Studio 2010\Projects\wcf\WCF_Entity\ASPWFC\Service References\myService\Reference.cs:161
       ASPWFC._Default.Page_Load(Object sender, EventArgs e) in D:\My Documents\Visual Studio 2010\Projects\wcf\WCF_Entity\ASPWFC\Default.aspx.cs:23
       System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +37
       System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +95
       System.Web.UI.Control.OnLoad(EventArgs e) +145
       System.Web.UI.Control.LoadRecursive() +134
       System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +3412

出于调试目的,我向服务添加了一个名为 Getparams(int id) 的函数 该函数所做的只是返回 id。我在 ASp 页面中调用了 Getparams 函数,并取回了传递的参数。我认为这意味着 GetProduct 函数中的参数被传递给服务并且在实体查询链接中的某处是错误。

我不明白的是为什么当我直接运行服务时,没有错误。数据库给了我一个结果

我又做了一些调试,发现打开错误的原因是:

sqlError: IIS AppPool\ASP.Net4 登录失败

我该如何解决这个问题,我的 sqlserver 通过 Windows 身份验证运行。

我在 msdn 中找到了一个修复安全问题的脚本,并且知道该代码可以正常工作

CREATE LOGIN [IIS APPPOOL\ASP.NET v4.0] 
  FROM WINDOWS WITH DEFAULT_DATABASE=[Northwind], 
  DEFAULT_LANGUAGE=[us_english]
GO
CREATE USER [NWUser] 
  FOR LOGIN [IIS APPPOOL\ASP.NET v4.0]
GO
EXEC sp_addrolemember 'db_datareader', 'NWUser'
GO

【问题讨论】:

  • 第一个建议是将objService 移动到Page_Load。其次是向我们展示完整的例外。出于调试目的,在调用周围放置一个 try/catch,然后发布 ex.ToString() 的结果。
  • 感谢您的更新。它表明当服务器尝试打开与数据库的连接时,问题发生在服务器上。尝试以与在客户端上相同的方式向服务添加跟踪,或者查看服务的事件日志以防详细信息已经存在。

标签: wcf wcfserviceclient


【解决方案1】:

在调试 WCF 服务时,确实有助于启用跟踪。这使您可以诊断模糊消息(“500 内部服务器错误”并没有真正泄露太多信息),而不会产生太多混乱。

到这里:http://msdn.microsoft.com/en-us/library/ms732023.aspx 查看详情。简而言之,添加

<system.diagnostics>
    <trace autoflush="true" />
    <sources>
            <source name="System.ServiceModel" 
                    switchValue="Information, ActivityTracing"
                    propagateActivity="true">
            <listeners>
               <add name="sdt" 
                   type="System.Diagnostics.XmlWriterTraceListener" 
                   initializeData= "c:\temp\wcfserver.log" />
            </listeners>
         </source>
    </sources>
</system.diagnostics>

发送给您的客户端、服务器或两者;酌情调整initializeData中的日志文件名。

运行您的程序,您应该会看到一两个日志文件。使用 Service Trace Viewer(Windows SDK 的一部分,随更高版本的 Windows 一起安装)打开它们,您应该会看到异常以红色突出显示。

WCF 引发的异常,尤其是内部异常,通常是非常显式的,所以这绝对值得。

(这也适用于System.Runtime.Serialization,它最近救了我几次培根。)

【讨论】:

  • 谢谢 - 因为我在服务端将它添加到 app.config 中,所以没有让它工作。阅读您关于将其添加到客户端的消息,我现在正在获取一个日志文件;)
猜你喜欢
  • 2018-08-24
  • 2010-10-30
  • 2011-05-29
  • 2014-08-02
  • 2011-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多