C#WCF Web服务最佳实践

C#WCF Web服务最佳实践,c#,web-services,wcf,C#,Web Services,Wcf,我对开发相对来说是新手,而且我大部分都是自学成才的,所以我知道的很多东西都是从谷歌搜索中获得的&从那里找到答案 也就是说,我已经组装了一个ASP MVC WebApp,它可以作为一个资产管理系统,运行得非常好 现在我想把它扩展到移动设备;然而,它需要离线工作,并且只有少量的功能 我计划雇用一名Android开发者为我整合一些可以利用我使用的Web服务的东西,但在我开始这么做之前,我想问一下是否有人可以看看我做了什么,告诉我我是否忽略了任何主要的东西。。。它是功能性的,但我意识到它没有达到行业标准

我对开发相对来说是新手,而且我大部分都是自学成才的,所以我知道的很多东西都是从谷歌搜索中获得的&从那里找到答案

也就是说,我已经组装了一个ASP MVC WebApp,它可以作为一个资产管理系统,运行得非常好

现在我想把它扩展到移动设备;然而,它需要离线工作,并且只有少量的功能

我计划雇用一名Android开发者为我整合一些可以利用我使用的Web服务的东西,但在我开始这么做之前,我想问一下是否有人可以看看我做了什么,告诉我我是否忽略了任何主要的东西。。。它是功能性的,但我意识到它没有达到行业标准,我想改进

我真的很感激您能给我一些反馈,告诉我哪里出了问题/没有达到标准&我应该关注哪些方面来改进这一点

谢谢

IWorkSvc.cs:

[ServiceContract]
public interface IWorkSvc
{
    [OperationContract]
    WebServiceResult AddEditWork(FmsWork w);

    [OperationContract]
    List<WSRWorkReason> ListWorkReasons();

    [OperationContract]
    List<WSRVehicle> ListVehicles(string reg = null);

    [OperationContract]
    WebServiceResult MobileLogin(string userName, string password);
}
[服务合同]
公共接口IWorkSvc
{
[经营合同]
WebServiceResult附加编辑工作(FmsWork w);
[经营合同]
列出ListWorkReasions();
[经营合同]
列表车辆(字符串reg=null);
[经营合同]
WebServiceResult MobileLogin(字符串用户名、字符串密码);
}
WorkSvc.svc:

 public class WorkSvc : IWorkSvc
   {
    readonly IRepository<Work> _workRepo;
    readonly IRepository<SecurityGroup> _secRepo;
    readonly IRepository<GroupPermission> _groupRepo;
    readonly IRepository<WorkItem> _itemRepo;
    readonly IRepository<Reason> _reasonRepo;
    readonly IRepository<Vehicle> _vehicleRepo;
    readonly IRepository<LogonTracker> _logonRepo;
    readonly IUnitOfWork _uow;

    public WorkSvc()
    {
        IUnitOfWork uow = new UnitOfWork<FMSEntities>();
        _uow = uow;
        _workRepo = _uow.GetRepository<Work>();
        _secRepo = uow.GetRepository<SecurityGroup>();
        _groupRepo = uow.GetRepository<GroupPermission>();
        _itemRepo = _uow.GetRepository<WorkItem>();
        _reasonRepo = _uow.GetRepository<Reason>();
        _vehicleRepo = _uow.GetRepository<Vehicle>();
        _logonRepo = uow.GetRepository<LogonTracker>();
    }

    public List<WSRWorkReason> ListWorkReasons()
    {
        DataTable dt = new DataTable();

        var data = _reasonRepo.Find(x => x.Active).ToList();
        var refinedData = data.Select(x => new WSRWorkReason()
        {
            ReasonId = x.Id,
            Reason = x.ReasonDescriptor
        }).ToList();

        return refinedData;
    }

    public List<WSRVehicle> ListVehicles(string reg = null)
    {
        List<Vehicle> vehicleList = new List<Vehicle>();

        if (string.IsNullOrEmpty(reg))
        {
            vehicleList = _vehicleRepo.Find(x => x.Sold != true && x.Disposed != true).OrderBy(x => x.Registration)
                .ToList();
        }
        else
        {
            vehicleList = _vehicleRepo
                .Find(x => x.Sold != true && x.Disposed != true && x.Registration.Contains(reg.ToUpper()))
                .OrderBy(x => x.Registration).ToList();
        }

        var refinedData = vehicleList.Select(x => new WSRVehicle()
        {
            VehicleId = x.Id,
            Reg = x.Registration
        }).ToList();

        return refinedData;
    }

    public WebServiceResult AddEditWork(FmsWork w)
    {
        WebServiceResult wsr = new WebServiceResult()
        {
            Type = "Work",
            Success = false,
            Message = "",
        };

        try
        {
            if (w != null)
            {
                Work work = new Work()
                {
                    Id = w.Id,
                    VehicleId = w.VehicleId,
                    HoursOfLabour = w.HoursOfLabour,
                    Description = w.Description,
                    Date = w.Date,
                    Notes = w.Notes,
                    ReasonId = w.ReasonId,
                    CreatedOn = DateTime.Now,
                    CreatedBy = w.CreatedBy,
                    ModifiedBy = w.ModifiedBy,
                    ModifiedOn = w.ModifiedOn
                };

                if (w.Id > 0)
                {
                    _workRepo.Update(work);
                    wsr.Type = "Update";
                }
                else
                {
                    _workRepo.Add(work);
                    wsr.Type = "Update";
                }
                _uow.Save();

                wsr.Success = true;
                wsr.Message = "Successfully Added";
            }
        }
        catch (Exception e)
        {
            wsr.Message = e.Message;
            wsr.Success = false;
        }

        return wsr;
    }

    public WebServiceResult MobileLogin(string user, string password)
    {
        WebServiceResult wsr = new WebServiceResult()
        {
            Action = "Mobile Login",
            Success = false,
            Type = "Mobile Login"
        };

        var strRoles = new string[] { };
        var strError = string.Empty;

        wsr.Success = (new LDAPAuth(ConfigurationManager.AppSettings["domain"]).MobileLogin(user, password,
            ref strRoles, ref strError));

        if (!wsr.Success)
        {
            wsr.Message = strError;
        }
        return wsr;
    }
}
公共类WorkSvc:IWorkSvc
{
只读IRepository\u workRepo;
只读电子存储_secRepo;
只读IRepository\u groupRepo;
只读电子存储项目报告;
只读易读报告;
只读电子存储车辆EPO;
只读IRepository\u logonRepo;
只读IUnitOfWork;
公共工程
{
IUnitOfWork uow=新UnitOfWork();
_uow=uow;
_workRepo=_uow.GetRepository();
_secRepo=uow.GetRepository();
_groupRepo=uow.GetRepository();
_itemRepo=_uow.GetRepository();
_reasonRepo=_uow.GetRepository();
_VehiclerRepo=_uow.GetRepository();
_logonRepo=uow.GetRepository();
}
公共列表ListWorkReasons()
{
DataTable dt=新的DataTable();
var data=_reasonRepo.Find(x=>x.Active.ToList();
var refinedData=data.Select(x=>newwsrWorkReason()
{
ReasonId=x.Id,
Reason=x.ReasonDescriptor
}).ToList();
返回数据;
}
公共列表车辆(字符串reg=null)
{
列表车辆列表=新列表();
if(string.IsNullOrEmpty(reg))
{
vehicleList=\u VehicleReporto.Find(x=>x.Seld!=true和&x.Disposed!=true)。OrderBy(x=>x.Registration)
.ToList();
}
其他的
{
vehicleList=\u vehicleRepo
.Find(x=>x.sell!=true和&x.Disposed!=true和&x.Registration.Contains(reg.ToUpper()))
.OrderBy(x=>x.Registration).ToList();
}
var refinedData=vehicleList.Select(x=>newwsrvehicle()
{
VehicleId=x.Id,
Reg=x.注册
}).ToList();
返回数据;
}
公共Web服务结果添加工作(FmsWork w)
{
WebServiceResult wsr=新的WebServiceResult()
{
Type=“工作”,
成功=错误,
Message=“”,
};
尝试
{
如果(w!=null)
{
工作=新工作()
{
Id=w.Id,
VehicleId=w.VehicleId,
HoursofLabor=w.HoursofLabor,
描述=w.描述,
日期=w.日期,
注释=w.注释,
ReasonId=w.ReasonId,
CreatedOn=DateTime。现在,
CreatedBy=w.CreatedBy,
ModifiedBy=w.ModifiedBy,
ModifiedOn=w.ModifiedOn
};
如果(w.Id>0)
{
_工作报告更新(工作);
wsr.Type=“更新”;
}
其他的
{
_工作报告添加(工作);
wsr.Type=“更新”;
}
_uow.Save();
wsr.Success=true;
wsr.Message=“已成功添加”;
}
}
捕获(例外e)
{
wsr.Message=e.Message;
wsr.Success=false;
}
返回wsr;
}
公共WebServiceResult MobileLogin(字符串用户,字符串密码)
{
WebServiceResult wsr=新的WebServiceResult()
{
Action=“移动登录”,
成功=错误,
Type=“移动登录”
};
var strRoles=新字符串[]{};
var strError=string.Empty;
wsr.Success=(新的LDAPAuth(ConfigurationManager.AppSettings[“域]).MobileLogin(用户、密码、,
参考标准,参考标准);
如果(!wsr.Success)
{
wsr.Message=strError;
}
返回wsr;
}
}
web.config:(这给了我很多麻烦!!)



您可以在中发布这个问题,我真想知道为什么您选择WCF而不是基于REST的api。你能详细解释一下吗?嗨,我已经把它贴在上面了,谢谢你。彼得,当我在研究如何做到这一点时,我用了一些不同的方法;这是我第一次开始工作!如果不是合适的选择,请告诉我是什么?
<system.serviceModel>

<services>
  <service name="FMS.WebServices.WorkSvc" behaviorConfiguration="Behaviour1">

    <endpoint address="http://localhost:65166/WebServices/WorkSvc.svc" contract="FMS.WebServices.IWorkSvc" binding="basicHttpBinding" /> 
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />

  </service>
</services>

<behaviors>
  <serviceBehaviors>
    <behavior name="Behaviour1">
      <serviceMetadata httpGetEnabled="True" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>
<bindings>
  <wsHttpBinding>
    <binding name="wsHttpEndpointBinding" maxReceivedMessageSize="2147483647" maxBufferPoolSize="2147483647" receiveTimeout="24:0:0" sendTimeout="24:0:0" openTimeout="24:0:0">
      <security mode="None">
        <transport clientCredentialType="None" />
        <message establishSecurityContext="false" />
      </security>
    </binding>
  </wsHttpBinding>
</bindings>