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