Hi, I have shared a demo project Github repository with you so you can see a project based on the template project illustrating the problem. The code connects to the same database that has been deployed to myasp.net and as you can see works in Debug on the local machine.
http://vfsdemo-001-site1.btempurl.com/ Is the Url you can see the code is deployed to. When you run it here and try to register the registration will fail because the ConfirmEmail template can't be found.
On localhost the code works because of the ReplaceEmbeddedAsPhysical. On the deployed version it doesn't work because the EmbeddedFiles aren't being found in the virtualfilesyste,.
Everything else is the same as both the local and deployed code are pointing to the same database. Any help in what I have done wrong here, if it isn't a bugm, would be helpful.
Let me know if you need anything else. Thanks
If you're creating a bug/problem report, please include followings:
I have this code in the WebModule to configure the VirtualFIleSystem
private void ConfigureVirtualFileSystem(IWebHostEnvironment hostingEnvironment)
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<HourcoinWebModule>();
options.FileSets.AddEmbedded<HourcoinDomainModule>(
baseNamespace: "Hourcoin.Templates",
baseFolder: "/Templates");
options.FileSets.AddEmbedded<RegistrationDomainModule>();
if (hostingEnvironment.IsDevelopment())
{
options.FileSets.ReplaceEmbeddedByPhysical<HourcoinDomainSharedModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}Hourcoin.Domain.Shared", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<HourcoinDomainModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}Hourcoin.Domain", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<HourcoinApplicationContractsModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}Hourcoin.Application.Contracts", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<HourcoinApplicationModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}Hourcoin.Application", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<HourcoinHttpApiModule>(Path.Combine(hostingEnvironment.ContentRootPath, string.Format("..{0}..{0}src{0}Hourcoin.HttpApi", Path.DirectorySeparatorChar)));
options.FileSets.ReplaceEmbeddedByPhysical<HourcoinWebModule>(hostingEnvironment.ContentRootPath);
}
});
}
This works in development as the Physical File is used using the above ReplaceEmbeddedByPhysical. When deployed to IIS at myasp.net the email is not working because the template is not being rendered. I have caught the error and displayed it in the following screenshot image.
I have made sure the files in the Templates directory are Embedded Resources.
What could I be missing? Any help or suggestions would be appreciated .as i have followed all the documentation I can find and have not had any luck. I keep getting the error even after specifically ensuring the environment is Production in the web.c onfig which shouldn't be necessary. Is there a bug in the VirtualFIleSystem?
Hi, I had a working Text Templating Email with a layout using the Razor Engine in version 6.0.
Now I have updated the project to version 7.0.1 and it didn't compile due to the .withRazorEngine() line in the following code in the EmailTemplateDefinitionProvider class
public override void Define(ITemplateDefinitionContext context)
{
context.Add(
new TemplateDefinition(
"EmailLayout",
isLayout: true
)
.WithRazorEngine()
.WithVirtualFilePath(
"/Templates/EmailLayout.cshtml",
isInlineLocalized: true
)
);
context.Add(new TemplateDefinition("ConfirmEmail",
typeof(HourcoinResource),
layout: "EmailLayout")
.WithVirtualFilePath(
"/Templates/ConfirmEmail.cshtml",
isInlineLocalized: true
)
.WithRazorEngine()
);
}
To get the code to compile I had to remove the .WithRazorEngine() line
I thought there may have been an update and so following the TextTemplating documentation for version 7 I used the following command abp add-package Volo.Abp.TextTemplating.Razor and got the following message.
[13:03:04 WRN] 'Volo.Abp.TextTemplating.Razor' nuget package could not be found!
So now I receive the email but instead of it being rendered I see the @Body from the EmailLayout instead of the contents from the model.
It appears the documentation is therefore out of date. How can I get this to work in version 7? Has it moved to another package?
Kind Regards
No Exception the email is sent but it isn't rendered by the razor engine as it doesn't seem to be there anymore.
I think there is a bug in the CmsKit in that you can't override the model and view as you should be able to do under the normal Abp principles. The OnGet method in the base class cannot be overriden.
How can I solve this as I do not have access to the source code to completely write my own handler by copying everything in the base class and building it up from there?
InvalidOperationException: Multiple handlers matched. The following handlers matched route data and had all constraints satisfied: Void OnGetAsync(), System.Threading.Tasks.Task OnGetAsync()
public BlogPostPublicDto LatestPost { get; set; } public void OnGetAsync() { base.OnGetAsync(); LatestPost = base.Blogs.Items.OrderByDescending(d => d.CreationTime).Take(1).First();
}
This compiles but throws the exception because of the OnGet handler in the base class.
public new void OnGetAsync() to hide the base class implementation also compiles but still get the same Exception as multiple handlers match when you run it.
The fix would normally be to override the method. I've done this with other pages but it doesn't work here.
public override void OnGetAsync() { }
But this doesn't compile as the OnGet method in the base class has not been marked virtual and cannot be overridden. Any help to sort this out would be appreciated.
Thanks - that's great. I noticed you have checked this into the Abp MailKitSmtpEmailSender too now. Will this be included in the version 6.0 final release? Or will it be sometime later that we will no longer need to do this override ourselves?
Thanks a lot.
Hi, Are you saying that in an ABP application we are forced to use the Google SMTP server? And therefore create a gmail email address for the sending of emails from the application.
I am sending email from the 123-reg SMTP server and so I am not using the Google SMTP server. The problem is that because we can't set the MessageId using the ABP IEmailSender the Gmail Spam filters prevent emails from being delivered to Gmail addresses meaning people with Gmail accounts can't register for the application and confirm their emails.
If we could set the MessageId in the email header we could send email from any SMTP server and they would pass through the spam filter used by Gmail. It seems to me that if the ABP email sending service added this header the issue would be fixed.
The emails are sent successfully to email accounts that don't check the messageId for spam with my current setup.
When I deploy the application to a docker container on azure I find that emails to gmail accounts are not accepted. I have created an email with 123-reg server and am using this to send out the emails on user registration.
The email gets sent successfully to many email accounts I have but is rejected by all the gmail accounts I have tested. The response is below. How can we set the MessageId in abp?
Any help would be appreciated as I need to allow users with gmail addresses to be able to register.
FYI, The message id header is not required currently, but is used by several spam filters including gmail. As for what it needs to be set to, something unique.
Reason: There was an error while attempting to deliver your message with [Subject: "Please Confirm your email"] to adam.musson@gmail.com. MTA p3plwbeout16-03.prod.phx3.secureserver.net received this response from the destination host IP - 142.250.141.27 - 550 , 550-5.7.1 [173.201.193.58] Messages missing a valid messageId header are not 550 5.7.1 accepted. lb10-20020a17090b4a4a00b00200b96d234csi12474831pjb.49 - gsmtp
Hi, The LeptonX theme is now the default but there are a number of things that are annoying and difficult to work out without documentation or source code. Can you tell me where I can find guidance on the following?
I can override the Image in the Login form using the BrandingProvider but it has an annoying Lepton watermark and Lepton logo above the login form remains even though the BrandingProvider is specifying another logo which is picked up by the other main standard layout. How can I override this as I do not have the source code to see what the original form has?
There is no language selector on the Login form. Is this intentional?
There is no code available for the LeptonX theme but there is for the Lepton theme. Should we be using Lepton or LeptonX going forward?
I am using version 6.0.0-rc.3 Thanks for your help. Adam
Hi enisn, Thanks for looking at this. I created a new service with the name CategoryService using the abp cli command to add it to the services directory of the main solution. The Category entity is in the new CategoryService domain and all the code looks similar to that in the ProductService except that it is dealing with Category and the CategoryDtos. Category is defined as
public class Category : Entity<Guid>
{
public string Name { get; private set; }
protected Category()
{
}
public Category(Guid id, string name): base(id)
{
SetName(name);
}
public void SetName(string name)
{
Check.NotNullOrEmpty(name, nameof(name), 100, 3);
Name = name;
}
}
The Url https://localhost:44725 is the Url for the new CategoryService. The Web Gateway URL is https://localhost:44325 which I think is the standard.
If there is anything else let me know. But I followed the ProductService as a guide very closely and there is very little difference other than the fact that it is dealing with Category entities.
Could not found remote action for method Check the docs before asking a question: https://docs.abp.io/en/commercial/latest/ Check the samples, to see the basic tasks: https://docs.abp.io/en/commercial/latest/samples/index The exact solution to your question may have been answered before, please use the search on the homepage.
If you're creating a bug/problem report, please include followings:
[RemoteService(Name = CategoryServiceRemoteServiceConsts.RemoteServiceName)]
[Area("categoryService")]
[Route("api/category-service/categories")]
public class CategoryController : CategoryServiceController, ICategoryAppService
{
private readonly ICategoryAppService _categoryAppService;
public CategoryController(ICategoryAppService categoryAppService)
{
_categoryAppService = categoryAppService;
}
//doesn't work
[HttpGet]
[Route("{id}")]
public virtual Task<CategoryDto> GetAsync(Guid id)
{
return _categoryAppService.GetAsync(id);
}
//works
[HttpGet]
public virtual Task<PagedResultDto<CategoryDto>> GetListAsync(GetCategoriesInput input)
{
return _categoryAppService.GetListAsync(input);
}
//doesn't work
[HttpPost]
public virtual Task<CategoryDto> CreateAsync(CategoryCreateDto input)
{
return _categoryAppService.CreateAsync(input);
}
[HttpPut]
[Route("{id}")]
public virtual Task<CategoryDto> UpdateAsync(Guid id, CategoryUpdateDto input)
{
return _categoryAppService.UpdateAsync(id, input);
}
[HttpDelete]
[Route("{id}")]
public virtual Task DeleteAsync(Guid id)
{
return _categoryAppService.DeleteAsync(id);
}
}
}
Where am I going wrong? Is there something simple I am missing. Thanks.