插入方法有效,但GET方法无效

时间:2019-04-18 12:26:53

标签: c# .net wcf

我正在使用WCF对Northwind数据库进行CRUD操作。

首先,我创建了POST方法,当我使用WCF测试客户端尝试该方法时可以使用,但是get方法显示此错误:

无法调用服务。可能的原因:服务离线或无法访问;客户端配置与代理不匹配;现有代理无效。有关更多详细信息,请参考堆栈跟踪。您可以尝试通过启动新代理,恢复为默认配置或刷新服务来恢复。

我不知道是否要使ViewModel具有与Employees类相同的属性,然后对其进行迭代并显示结果?

这是配置文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.serviceModel>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" sendTimeout="00:05:00" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:55658/Service1.svc" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="IService1"
                name="BasicHttpBinding_IService1" />
        </client>
    </system.serviceModel>
</configuration>

这是get方法:

 public IEnumerable<Employee> GetEmployees()
        {
            List<Employee> list = new List<Employee>();
            NorthwindContext db = new NorthwindContext();
            list = db.Employees.ToList();
            return list;
        }

这是服务:

 [ServiceContract]
    public interface IService1
    {
        [OperationContract]
        IEnumerable<Employee> GetEmployees();
        [OperationContract]
        void InsertEmployee(Employee e);
        [OperationContract]
        void UpdateEmployee(Employee e);
        [OperationContract]
        void DeleteEmployee(int id);
    }

更新

好的,我解决了这个问题,雇员类具有外键,并且该客户端无法“读取”它,并且由于他不知道如何读取该属性,因此显示错误。

我所做的就是我制作了EmployeeView类并插入了我想显示的属性。

Get方法现在看起来像这样

public IEnumerable<EmployeeView> GetEmployees()
        {
            NorthwindContext db = new NorthwindContext();
            IQueryable<EmployeeView> list = db.Employees.Select(e => new EmployeeView
            {
                EmployeeID = e.EmployeeID,
                FirstName = e.FirstName,
                LastName = e.LastName
            });

            return list;
        }

2 个答案:

答案 0 :(得分:1)

如果员工具有到另一个表的外键,将发生解析错误。您需要为员工类别创建另一个模型dto

型号:

public int EmployeeId {get;set;}
public ICollection<Order> Orders{get;set;} // this causes to parse error. Because this object have ICollection<Employee> and this causes infinite loop

ModelDto:

public int EmployeeId {get;set;}

或者如果您要发送订单,也可以创建另一个dto

答案 1 :(得分:0)

WCF通过属性公开所谓的合同,将以下属性添加到Get方法以使其对服务可见

[OperationContract]

您可以选中https://docs.microsoft.com/en-us/dotnet/api/system.servicemodel.operationcontractattribute?view=netframework-4.7.2来了解更多信息。

要点是这个

  

表示方法定义了属于服务一部分的操作   Windows Communication Foundation(WCF)应用程序中的合同。

 [OperationContract]
public IEnumerable<Employee> GetEmployees()
        {
            List<Employee> list = new List<Employee>();
            NorthwindContext db = new NorthwindContext();
            list = db.Employees.ToList();
            return list;
        }

然后下一步是浏览到该服务并检查它在浏览器中显示的内容(在VS中简单运行该服务就足够了) 或者,如果该服务已经托管,则可以从浏览器浏览到它。

更好的服务测试是使用WCF测试客户端,如果已安装Visual Studio,则应将其默认设置。