WEBVTT
00:00:00.350 --> 00:00:02.235
>> How are you, John?
00:00:02.235 --> 00:00:03.975
>> I'm good. Last week,
00:00:03.975 --> 00:00:06.105
I was in Denver for DNN Summit.
00:00:06.105 --> 00:00:08.895
I get the keynote there.
00:00:08.895 --> 00:00:11.550
It was really cool thinking back on.
00:00:11.550 --> 00:00:13.590
>> Which summit? Which one?
00:00:13.590 --> 00:00:16.005
>> DNN, DotNetNuke.
00:00:16.005 --> 00:00:17.950
>> Oh, yeah.
00:00:18.560 --> 00:00:20.700
>> It's a really cool community.
00:00:20.700 --> 00:00:23.200
It's really tight like family.
00:00:23.270 --> 00:00:29.620
I got my start in
both some opensource stuff,
00:00:31.280 --> 00:00:34.680
I worked in like
corporate back-end shops
00:00:34.680 --> 00:00:35.970
and then I actually worked
00:00:35.970 --> 00:00:39.900
in a consulting thing with
Phil Haack and some friends,
00:00:39.900 --> 00:00:42.255
and we built websites
and we used DNN.
00:00:42.255 --> 00:00:44.865
So, it was cool giving the keynote,
00:00:44.865 --> 00:00:47.145
being able to call back
to some of that stuff.
00:00:47.145 --> 00:00:48.030
>> Very cool.
00:00:48.030 --> 00:00:49.080
>> Yeah, they're doing
some new things.
00:00:49.080 --> 00:00:51.315
>> Someone says, "The sound is good."
00:00:51.315 --> 00:00:52.845
That's music to my ears.
00:00:52.845 --> 00:00:54.120
I came in today in Gulnaz.
00:00:54.120 --> 00:00:55.215
I was like, "We've fixed it.
00:00:55.215 --> 00:00:57.630
It's going to be perfect.
This ad is amazing."
00:00:57.630 --> 00:01:00.945
And I'm like, "Okay,
I've heard that before."
00:01:00.945 --> 00:01:03.765
Someone says it sounds
good, so that's good.
00:01:03.765 --> 00:01:07.905
Well, let's have viewers
in on our little secret.
00:01:07.905 --> 00:01:11.040
You couldn't hear us when
we were docking before.
00:01:11.040 --> 00:01:12.405
So, we had to change.
00:01:12.405 --> 00:01:14.450
You're currently running
through a different microphone.
00:01:14.450 --> 00:01:15.620
You are using the crappy
00:01:15.620 --> 00:01:17.600
little camera-microphone
up there to hear us,
00:01:17.600 --> 00:01:19.250
but that doesn't affect
anyone watching the stream.
00:01:19.250 --> 00:01:20.845
So, yeah whatever you going to do.
00:01:20.845 --> 00:01:23.770
So, I was on vacation last week.
00:01:23.770 --> 00:01:24.850
So, I would have to
talked about this.
00:01:24.850 --> 00:01:24.970
>> You were.
00:01:24.970 --> 00:01:28.010
>> I was in sunny
Hawaii wondering why
00:01:28.010 --> 00:01:31.265
people go skiing when they
could go to the beach.
00:01:31.265 --> 00:01:34.010
Maybe that's because
I'm an Australian,
00:01:34.010 --> 00:01:36.290
maybe it's just because
I'm not a skiing person.
00:01:36.290 --> 00:01:37.725
I have skied once,
00:01:37.725 --> 00:01:39.095
but there's all these people here
00:01:39.095 --> 00:01:40.580
that I know very good friends of mine
00:01:40.580 --> 00:01:43.655
and neighbors who
it's mid-winter break
00:01:43.655 --> 00:01:46.280
and they're off skiing and they
are like,'' Look at us skiing on
00:01:46.280 --> 00:01:47.570
the mountain,'' and it's minus
00:01:47.570 --> 00:01:49.940
27 degrees Celsius and
I'm not even kidding,
00:01:49.940 --> 00:01:53.960
and I'm sitting in 27 degrees
Celsius on the beach,
00:01:53.960 --> 00:01:57.350
on a lounge chair and Mickey Mouse
is handing me a Mai Tai.
00:01:57.350 --> 00:02:00.410
I'm like, "Why would you go
skiing when you could be here."
00:02:00.410 --> 00:02:01.820
So, I don't get it.
00:02:01.820 --> 00:02:03.530
But goal power to people
who'd like skiing.
00:02:03.530 --> 00:02:04.775
I think John you like skiing.
00:02:04.775 --> 00:02:07.145
>> Yeah. Well, so I do like skiing.
00:02:07.145 --> 00:02:09.785
I did a good amount in the past,
00:02:09.785 --> 00:02:11.630
but I was looking at
00:02:11.630 --> 00:02:14.570
the lift tickets that were
clipped on my- first of all,
00:02:14.570 --> 00:02:17.615
I did dig through the garage to
even find my cold-weather clothes.
00:02:17.615 --> 00:02:20.825
Then, one of the tickets
at 1998 on it,
00:02:20.825 --> 00:02:22.520
and I'm like, "Yeah, it's been."
00:02:22.520 --> 00:02:24.800
I've skied maybe four times
in the past 15 years.
00:02:24.800 --> 00:02:26.155
>> Wow, okay.
00:02:26.155 --> 00:02:29.180
>> So, and I think maybe
part of why I don't
00:02:29.180 --> 00:02:30.230
mind the cold is
00:02:30.230 --> 00:02:32.150
because I'm in San Diego,
it is cold all the time.
00:02:32.150 --> 00:02:33.575
>> Yes.
00:02:33.575 --> 00:02:38.070
>> I don't mind like for couple
of days ever few years like out.
00:02:38.070 --> 00:02:40.560
>> Okay. Juxtapose that
with what I dealt with
00:02:40.560 --> 00:02:43.255
the week before we
get back to Hawaii,
00:02:43.255 --> 00:02:45.530
where no one was at work here and
00:02:45.530 --> 00:02:46.850
my kids were at home
because we were all
00:02:46.850 --> 00:02:48.680
snowed in under four feet of snow,
00:02:48.680 --> 00:02:50.915
and I had to dig out my driveway
00:02:50.915 --> 00:02:53.300
every morning for
three or four days in a row.
00:02:53.300 --> 00:02:55.460
So, yeah, we just
point that interested.
00:02:55.460 --> 00:02:56.570
But some people went and saw
00:02:56.570 --> 00:02:58.010
most snow, because
"Oh, isn't it great.
00:02:58.010 --> 00:03:00.335
Let's go get more snow."
So, what are you going do?
00:03:00.335 --> 00:03:02.000
That's all right. So, it's
00:03:02.000 --> 00:03:03.545
been awhile since I've
been on the show.
00:03:03.545 --> 00:03:04.705
>> It has.
00:03:04.705 --> 00:03:07.730
>> I think we're going on
and talking about API stuff,
00:03:07.730 --> 00:03:09.410
and I think we had
another blazer update
00:03:09.410 --> 00:03:11.150
and we had a nice something else?
00:03:11.150 --> 00:03:12.350
Who else we'd be having?
Who have you been
00:03:12.350 --> 00:03:13.895
talking to while I've
not been here John?
00:03:13.895 --> 00:03:15.440
>> Yeah, that's been mostly Bennett.
00:03:15.440 --> 00:03:19.070
We've teased a David Fowler show
but something keeps coming up.
00:03:19.070 --> 00:03:20.360
>> He can't commit.
00:03:20.360 --> 00:03:22.150
That man cannot commit.
00:03:22.150 --> 00:03:24.330
I tried to wrote him today
but he wouldn't come.
00:03:24.330 --> 00:03:25.080
>> Yeah.
00:03:25.080 --> 00:03:26.470
>> All right.
00:03:26.470 --> 00:03:29.780
>> I'll be like, "Hey, how does
stand up next week sound?"
00:03:29.780 --> 00:03:31.580
He'll be like, "Yeah, it sounds
great and then I'll be like,
00:03:31.580 --> 00:03:34.260
"Okay, it's tomorrow is
like I can't do it.".
00:03:34.310 --> 00:03:37.970
>> So it looks like, it
looks like Jeff has bumped
00:03:37.970 --> 00:03:41.345
us of the Visual Studio
Twitch channel again.
00:03:41.345 --> 00:03:42.785
>> He's what?
00:03:42.785 --> 00:03:47.015
>> So, the Visual Studio Twitch
channel is now hosting C# Fritz
00:03:47.015 --> 00:03:50.090
again which it was
before the show and
00:03:50.090 --> 00:03:53.480
then we started streaming and
we took over but now he's back.
00:03:53.480 --> 00:03:55.325
They went on twitch anymore.
00:03:55.325 --> 00:03:57.365
>> Now that's weird. I'm seeing.
00:03:57.365 --> 00:03:59.255
I think I still see us on here.
00:03:59.255 --> 00:04:01.245
Are you sure you're live?
00:04:01.245 --> 00:04:03.420
>> I'll hit "F5".
00:04:03.860 --> 00:04:07.955
Now I see us, I don't know
what happened. That's weird.
00:04:07.955 --> 00:04:10.250
Maybe other people experienced
that as well as hit "F5",
00:04:10.250 --> 00:04:12.340
and it'll be fine.
00:04:12.340 --> 00:04:13.065
>> All right.
00:04:13.065 --> 00:04:14.445
>> You loved the community John?
00:04:14.445 --> 00:04:16.635
>> I always love the
community let's do this.
00:04:16.635 --> 00:04:18.570
>> Let's do it. Let
me find the button.
00:04:18.570 --> 00:04:22.090
Let me move the buttons
around. That one.
00:04:22.250 --> 00:04:26.110
>> Hurray. Okay. In the spirit
00:04:26.110 --> 00:04:28.660
of community and excitement and
all this we have coming up.
00:04:28.660 --> 00:04:31.905
This is Visual Studio
2019 launch event.
00:04:31.905 --> 00:04:32.805
>> Okay.
00:04:32.805 --> 00:04:34.660
>> Community-wise why that's
00:04:34.660 --> 00:04:36.640
important is we've
got worldwide events.
00:04:36.640 --> 00:04:39.130
These are in partnership
with our meetups.
00:04:39.130 --> 00:04:42.915
So you're developing ASP.NET,
00:04:42.915 --> 00:04:44.830
there's a good chance
you're using Visual Studio,
00:04:44.830 --> 00:04:48.285
Visual Studio 20- are used
in Visual Studio, 2019 live?
00:04:48.285 --> 00:04:50.020
>> I am almost exclu-
00:04:50.020 --> 00:04:52.210
well pretty much exclusively
because the things I'm
00:04:52.210 --> 00:04:54.295
doing in VS today and I'll
talk about this in a minute
00:04:54.295 --> 00:04:57.535
is experience reviews for
all the call 30 stuff.
00:04:57.535 --> 00:04:59.795
So I am exclusively in preview.
00:04:59.795 --> 00:05:01.815
>> Yeah, I'm too.
00:05:01.815 --> 00:05:04.515
For the most part,
the biggest jarring
00:05:04.515 --> 00:05:06.140
changed for me or
just something to get used
00:05:06.140 --> 00:05:10.690
to is the brand new File New
are just opening up for you.
00:05:10.690 --> 00:05:11.625
>> Oh, yeah.
00:05:11.625 --> 00:05:13.730
>> I think that's fine. It's cool.
00:05:13.730 --> 00:05:16.010
>> Yeah. So, we we've
yet to integrate all the
00:05:16.010 --> 00:05:18.950
ASP.NET Core and.NET Core stuff
into that the way that we want to.
00:05:18.950 --> 00:05:21.590
That won't happen until further
00:05:21.590 --> 00:05:24.925
along in the.NET Core
three milestones.
00:05:24.925 --> 00:05:27.470
So right now you have to choose.
00:05:27.470 --> 00:05:28.670
I mean it's like it
always has been right.
00:05:28.670 --> 00:05:30.620
You choose ASP.NET Core
application and you get the one
00:05:30.620 --> 00:05:33.035
ASP.NET dialog where you
then choose other stuff.
00:05:33.035 --> 00:05:35.270
We don't want that to be
the way moving forward
00:05:35.270 --> 00:05:37.410
you should be at a type in
the new search experience and say,
00:05:37.410 --> 00:05:38.900
"Hey, I want to build an API and
00:05:38.900 --> 00:05:40.760
that should filter and give
you the API template."
00:05:40.760 --> 00:05:42.440
That doesn't work today. So a
00:05:42.440 --> 00:05:44.570
couple more months before we'll
get that type of stuff working.
00:05:44.570 --> 00:05:45.920
>> Yeah, and the other thing that's
00:05:45.920 --> 00:05:48.005
jarring me actually
talking about this is
00:05:48.005 --> 00:05:53.550
the C# Editor has new colorization.
00:05:53.770 --> 00:05:58.130
I mean it's great but
my brain still can't
00:05:58.130 --> 00:06:01.670
get used to the fact that instance
methods are all brown now.
00:06:01.670 --> 00:06:04.430
I used the normal theme
not the dark theme.
00:06:04.430 --> 00:06:05.090
>> Okay.
00:06:05.090 --> 00:06:06.890
>> My keywords are like magenta,
00:06:06.890 --> 00:06:10.880
like If and Else are magenta and
then other keywords are blue
00:06:10.880 --> 00:06:12.320
and the method names
00:06:12.320 --> 00:06:15.170
are brown and static methods
have a different color.
00:06:15.170 --> 00:06:18.350
It's very colorful.
00:06:18.350 --> 00:06:21.300
I'll put that and so
my muscle memory,
00:06:21.300 --> 00:06:24.090
my eye memory, my ocular memory
isn't quite there.
00:06:24.090 --> 00:06:26.175
Yeah, that's good.
00:06:26.175 --> 00:06:29.945
>> Interesting. Cool.
All right, so let's see.
00:06:29.945 --> 00:06:32.630
Scott Alan interesting
posts from him here.
00:06:32.630 --> 00:06:34.310
He's just looking at,
00:06:34.310 --> 00:06:36.170
and this is actually
something that came up.
00:06:36.170 --> 00:06:38.090
I'm talking to people
last week at the conference.
00:06:38.090 --> 00:06:39.800
Some people are just
still struggling with
00:06:39.800 --> 00:06:43.880
dependency injection and here
he makes the case for and
00:06:43.880 --> 00:06:47.450
explains why by looking at comparing
00:06:47.450 --> 00:06:51.860
an MVC Four or Five controller
00:06:51.860 --> 00:06:55.670
and looking at the user manager
and then comparing that.
00:06:55.670 --> 00:06:59.630
So, here's how things were
registered and then you
00:06:59.630 --> 00:07:04.415
use the ON context and it's
a service locator pattern.
00:07:04.415 --> 00:07:06.920
Then he talks about, "Hey,
00:07:06.920 --> 00:07:11.100
look you've got trade-offs with
00:07:11.100 --> 00:07:15.930
everything" but the code gets
simpler with ASP.NET Core.
00:07:15.930 --> 00:07:16.200
>>Right.
00:07:16.200 --> 00:07:18.410
>> So just nice little reminder
00:07:18.410 --> 00:07:20.540
and for people that are
like put off by that,
00:07:20.540 --> 00:07:23.940
I think it is good to look at.
00:07:23.940 --> 00:07:26.645
I think what you folks did with
00:07:26.645 --> 00:07:28.640
baking independency injection in
00:07:28.640 --> 00:07:31.320
a nice way into the startup
and then just everywhere.
00:07:31.320 --> 00:07:32.765
It's just available everywhere.
00:07:32.765 --> 00:07:36.590
I think to me it feels like if
dependency injection is something I
00:07:36.590 --> 00:07:38.330
have to wire up myself and
00:07:38.330 --> 00:07:40.715
it's only in places
that I've hooked it up.
00:07:40.715 --> 00:07:42.375
It's less useful but because
00:07:42.375 --> 00:07:44.970
dependency injection is
everywhere by default,
00:07:44.970 --> 00:07:47.400
it's like it's just part
of how you develop now.
00:07:47.400 --> 00:07:49.670
>> Yeah. We took a bet.
We took upon on it.
00:07:49.670 --> 00:07:53.405
We said it's not that we baked
in and gave you good support.
00:07:53.405 --> 00:07:56.135
It is the foundation
of the hosting model
00:07:56.135 --> 00:07:59.090
like the container
is the foundation of
00:07:59.090 --> 00:08:01.070
everything and you
get a container for
00:08:01.070 --> 00:08:02.930
each host and everything has
00:08:02.930 --> 00:08:04.790
to be configured in there
for our frameworks.
00:08:04.790 --> 00:08:07.775
You want use MVC. You want
to use middleware options.
00:08:07.775 --> 00:08:09.410
You can create instances of
00:08:09.410 --> 00:08:11.645
options and pass them
to middleware directly.
00:08:11.645 --> 00:08:14.570
But the web server itself
is in the container,
00:08:14.570 --> 00:08:17.765
or cat stores in the container
and you can't change that
00:08:17.765 --> 00:08:21.155
if you're using ASP.NET Core
the way it's designed to be used.
00:08:21.155 --> 00:08:24.880
So yeah, we took a big bet on
it and I think it's worked out.
00:08:24.880 --> 00:08:27.090
>> Yeah, I'm fan.
00:08:27.090 --> 00:08:29.310
Cool. Let me see.
00:08:29.310 --> 00:08:31.820
Scroll to the top here.
This is interesting.
00:08:31.820 --> 00:08:34.870
This is one of those little hidden
features of ASP.NET
00:08:34.870 --> 00:08:38.315
Core I didn't know was
there. Scott points out.
00:08:38.315 --> 00:08:40.940
If you have something
that's maybe dynamically
00:08:40.940 --> 00:08:43.810
setting a content type
for a download,
00:08:43.810 --> 00:08:45.860
so say for instance in a database or
00:08:45.860 --> 00:08:48.875
a file system it's something
generated on the fly,
00:08:48.875 --> 00:08:50.675
you need to set the content type.
00:08:50.675 --> 00:08:50.840
>> Right.
00:08:50.840 --> 00:08:52.280
>> Otherwise, let's say I want to
00:08:52.280 --> 00:08:54.265
download a PDF and I said it wrong,
00:08:54.265 --> 00:08:55.900
then I'm going to get jibberish.
00:08:55.900 --> 00:08:58.910
So you can go through and you
can do a switch case and you
00:08:58.910 --> 00:09:02.495
can try and do it yourself
or you can use the built-in.
00:09:02.495 --> 00:09:04.190
So I didn't know this was there
00:09:04.190 --> 00:09:07.310
the file extension
content-type provider.
00:09:07.310 --> 00:09:10.430
This is just a feature
and he links over to it,
00:09:10.430 --> 00:09:13.680
and as you can guess
is just a huge case,
00:09:13.680 --> 00:09:16.785
and every single file
type that you may need.
00:09:16.785 --> 00:09:19.760
This is so much better than
wiring it up yourself.
00:09:19.760 --> 00:09:21.860
This is something where it's
pretty complete and it's going to
00:09:21.860 --> 00:09:24.290
be maintained. So, yeah.
00:09:24.290 --> 00:09:27.540
>> If there's something there
that's missing send a PR,
00:09:27.540 --> 00:09:30.225
login in issue, the minimum
or even better,
00:09:30.225 --> 00:09:31.830
send a PR, and yeah.
00:09:31.830 --> 00:09:35.030
So, I think the list was initially
built using the list that's in
00:09:35.030 --> 00:09:39.110
iOS and then we've
extended it every time.
00:09:39.110 --> 00:09:42.435
>> Yeah, I got to see this history.
00:09:42.435 --> 00:09:47.335
>> The history was destroyed
because we removed the Monday repo.
00:09:47.335 --> 00:09:49.135
So you could go into the static file,
00:09:49.135 --> 00:09:51.505
the old static files repo
which is where it used to live
00:09:51.505 --> 00:09:53.620
and you'd be able to see
00:09:53.620 --> 00:09:56.875
the history there. No,
it's gone actually.
00:09:56.875 --> 00:10:02.710
>> Okay. So this is interesting
and this is one of those like,
00:10:02.710 --> 00:10:04.690
I didn't think of doing
this and maybe it's
00:10:04.690 --> 00:10:07.030
useful and maybe it's not.
Interested in your thoughts.
00:10:07.030 --> 00:10:10.660
So here I'm going to set up an ASP.
00:10:10.660 --> 00:10:13.315
Net Core application
running on Windows Sandbox.
00:10:13.315 --> 00:10:18.130
So, Windows Sandboxes is this
built-in to Windows, Windows 10 now.
00:10:18.130 --> 00:10:19.240
>> It's not out yet right?
00:10:19.240 --> 00:10:21.625
Isn't this in
the super duper previous?
00:10:21.625 --> 00:10:23.155
Let's be super clear right?
00:10:23.155 --> 00:10:25.210
>> Well, yes. So if
you're using one of
00:10:25.210 --> 00:10:26.460
the- what do they call them?
00:10:26.460 --> 00:10:27.610
>> [inaudible] or something.
00:10:27.610 --> 00:10:28.300
>> Yeah.
00:10:28.300 --> 00:10:29.185
>> Yeah. Okay.
00:10:29.185 --> 00:10:31.375
>> So think you know,
but it's on the way.
00:10:31.375 --> 00:10:32.080
>> Okay.
00:10:32.080 --> 00:10:34.330
>> So you enable this feature.
00:10:34.330 --> 00:10:37.270
I think it's mostly
useful for if you want to
00:10:37.270 --> 00:10:40.855
test out like say you
have some sketchy,
00:10:40.855 --> 00:10:43.720
I don't know, something you download
off the Internet something in
00:10:43.720 --> 00:10:44.890
XE and you don't want to screw
00:10:44.890 --> 00:10:45.460
up your machine. You want to test it.
00:10:45.460 --> 00:10:47.050
>> Sure.
00:10:47.050 --> 00:10:49.840
>> Whatever it is. Or maybe
it's just some, I don't know,
00:10:49.840 --> 00:10:51.730
line-of-business stupid
app you've got to
00:10:51.730 --> 00:10:53.680
use but you don't, whatever it is.
00:10:53.680 --> 00:10:58.465
So this allows you to get
this lightweight desktop isolation.
00:10:58.465 --> 00:11:01.945
I think it's mostly
useful for a desktop app,
00:11:01.945 --> 00:11:04.390
but here he's showing
using this for running
00:11:04.390 --> 00:11:07.150
an ASP.NET Core
application. So, yeah.
00:11:07.150 --> 00:11:11.560
So here he shows, he's
building these batch files,
00:11:11.560 --> 00:11:14.335
he's doing self-contained deployment,
00:11:14.335 --> 00:11:17.500
and then he's running it and he's
00:11:17.500 --> 00:11:21.595
got- here's this ASP.NET
Core app running here.
00:11:21.595 --> 00:11:23.530
Now, for my thoughts,
00:11:23.530 --> 00:11:27.595
this might be useful for testing
out a self-contained deployment,
00:11:27.595 --> 00:11:29.890
making sure that it'll
work because here you
00:11:29.890 --> 00:11:32.605
have the isolation from the base.
00:11:32.605 --> 00:11:35.095
So, similar to Docker,
00:11:35.095 --> 00:11:37.600
but then I'm not sure why you would
00:11:37.600 --> 00:11:40.390
use this over just using
Docker so, I don't know.
00:11:40.390 --> 00:11:42.145
>> Well, Docker doesn't give you
00:11:42.145 --> 00:11:43.510
anywhere near the level of
00:11:43.510 --> 00:11:45.235
oscillation that this
will give you right?
00:11:45.235 --> 00:11:47.830
>> I guess so. Docker containers by
00:11:47.830 --> 00:11:50.755
themselves on a security
boundary like this is.
00:11:50.755 --> 00:11:53.560
>> Yeah. Yeah. So anyhow,
00:11:53.560 --> 00:11:55.460
interesting as it gets
closer to shipping out.
00:11:55.460 --> 00:11:57.440
>> This is something.
00:11:57.810 --> 00:12:00.655
>> All right, Steve Gordon man.
00:12:00.655 --> 00:12:02.710
Just continue to watch.
00:12:02.710 --> 00:12:03.760
He's cranking stuff out,
00:12:03.760 --> 00:12:06.415
it was nice to see him
at MDC London recently.
00:12:06.415 --> 00:12:11.110
Here he's taking an early look
at gRPC and ASP.NET Core 3.
00:12:11.110 --> 00:12:12.910
Hopefully one of these days we'll
00:12:12.910 --> 00:12:15.425
get David Fowler on and we can get-
00:12:15.425 --> 00:12:17.105
>> That will be great.
00:12:17.105 --> 00:12:22.780
>> Yeah. But here he's
explaining gRPC schema
00:12:22.780 --> 00:12:24.460
first framework from Google
00:12:24.460 --> 00:12:28.585
supports service and
communication over HTTP2.
00:12:28.585 --> 00:12:30.220
The thing that he points
out here he said,
00:12:30.220 --> 00:12:35.290
it specified using
this kind of proto file.
00:12:35.290 --> 00:12:37.000
Then based on that,
00:12:37.000 --> 00:12:40.285
both client and server can
generate a lot for you.
00:12:40.285 --> 00:12:42.985
So proto based on Protobuf,
00:12:42.985 --> 00:12:45.940
then he shows wiring up on,
00:12:45.940 --> 00:12:47.515
this is pulling in.
00:12:47.515 --> 00:12:49.060
The two things he's pulling in here,
00:12:49.060 --> 00:12:50.920
one is the actual tools,
00:12:50.920 --> 00:12:52.225
the packages there for that.
00:12:52.225 --> 00:12:56.360
Then you also including a link
to the proto file there.
00:12:56.970 --> 00:13:00.985
So then he goes through
and wires up the server.
00:13:00.985 --> 00:13:03.940
Not a whole lot of
code here because it's
00:13:03.940 --> 00:13:08.275
self-describing because
of that schema.
00:13:08.275 --> 00:13:10.750
Then here he generates a client.
00:13:10.750 --> 00:13:13.600
This is a, excuse me here he's got
00:13:13.600 --> 00:13:18.955
a Kestrel for serving and
HTTP2 that's nice to see.
00:13:18.955 --> 00:13:23.470
Then he's generating a client
down here. This is the client.
00:13:23.470 --> 00:13:27.560
So, I think for this he
used the console app.
00:13:27.660 --> 00:13:30.205
Pretty lightweight here because
00:13:30.205 --> 00:13:32.095
they are both using
that same kind of-
00:13:32.095 --> 00:13:32.875
>> Contract.
00:13:32.875 --> 00:13:35.950
>> Yeah, contract I guess, right?
00:13:35.950 --> 00:13:40.420
>> Right. Yes. So then
that's basically it.
00:13:40.420 --> 00:13:42.880
A quick look at going
through and setting it up.
00:13:42.880 --> 00:13:45.175
>> Yeah, I was going to
show that actually today.
00:13:45.175 --> 00:13:46.690
>> So that's great.
00:13:46.690 --> 00:13:50.020
So I gave a little teaser
and then you can pick it.
00:13:50.020 --> 00:13:51.190
>> Perfect.
00:13:51.190 --> 00:13:56.110
>> Great. Okay. Thomas on my blog,
00:13:56.110 --> 00:13:58.345
actually a lot of good
posts here recently.
00:13:58.345 --> 00:14:00.235
This is one I picked out.
00:14:00.235 --> 00:14:02.110
This is an interesting thing of
00:14:02.110 --> 00:14:03.940
what if you have
several people on a team
00:14:03.940 --> 00:14:05.500
and they're all pointing at different
00:14:05.500 --> 00:14:07.480
databases for whatever reason?
00:14:07.480 --> 00:14:11.050
Or they have individual settings
that they need to do?
00:14:11.050 --> 00:14:14.860
So there's a lot of different ways
you can go through and do this.
00:14:14.860 --> 00:14:19.405
Here's an example from an
appSettings JSON perspective.
00:14:19.405 --> 00:14:22.210
So here first he starts
by talking through
00:14:22.210 --> 00:14:23.410
and pointing out what if you have
00:14:23.410 --> 00:14:25.120
different settings you want to do.
00:14:25.120 --> 00:14:27.745
One approach here is using
environment variables.
00:14:27.745 --> 00:14:29.680
So, go through and
just set it directly
00:14:29.680 --> 00:14:32.285
in an environment
variable on each machine.
00:14:32.285 --> 00:14:34.800
That's user-specific and something
00:14:34.800 --> 00:14:37.470
you've going to go
and tweak every time.
00:14:37.470 --> 00:14:40.920
Here's something he
shows also is using
00:14:40.920 --> 00:14:47.090
just an individual like
appsetting.yourname.jsonfile.
00:14:47.090 --> 00:14:53.620
And then, using this apps
environment machine name
00:14:53.620 --> 00:14:55.675
and basically pulling that in.
00:14:55.675 --> 00:14:57.850
So then, just using
00:14:57.850 --> 00:15:04.450
the standard appSettings system
it's just pulls that right in.
00:15:04.450 --> 00:15:06.475
So, that's an idea.
00:15:06.475 --> 00:15:08.605
It's already easy to do things like,
00:15:08.605 --> 00:15:11.380
you've got support for production
00:15:11.380 --> 00:15:14.650
and staging and all
that using appSettings,
00:15:14.650 --> 00:15:16.030
but you can also use
00:15:16.030 --> 00:15:19.270
your own machine name and
just do this thing there.
00:15:19.270 --> 00:15:21.100
So, nice little tip there.
00:15:21.100 --> 00:15:21.430
>> Cool.
00:15:21.430 --> 00:15:25.240
>> All right. So Ankit here
00:15:25.240 --> 00:15:28.090
posting about using
Google Cloud Firestore
00:15:28.090 --> 00:15:30.070
as a back-end for a Blazor Cloud app.
00:15:30.070 --> 00:15:35.110
So, Google Cloud Firestore is
one of these kind of cloudy,
00:15:35.110 --> 00:15:37.480
very lightweight data stores.
00:15:37.480 --> 00:15:39.460
>> Is it literally the
one they bought and
00:15:39.460 --> 00:15:42.265
then renamed? Is it Firebase?
00:15:42.265 --> 00:15:44.380
>> No, I think here it is.
00:15:44.380 --> 00:15:47.110
Console.firebase.Google.
00:15:47.110 --> 00:15:48.070
>> It's Firebase.
00:15:48.070 --> 00:15:48.940
>> Yeah, there you go.
00:15:48.940 --> 00:15:51.400
>> They bought Firebase
right? A few years ago.
00:15:51.400 --> 00:15:54.595
Now they've integrated
it and called it Google,
00:15:54.595 --> 00:15:58.585
what did you call it?
Something Firestore?
00:15:58.585 --> 00:16:00.100
>> Cloud Firestore.
00:16:00.100 --> 00:16:00.970
>> There you go.
00:16:00.970 --> 00:16:02.740
>> That was confusing me a bit
00:16:02.740 --> 00:16:04.450
before it because I
was like Firestore,
00:16:04.450 --> 00:16:05.575
I thought it was Firebase.
00:16:05.575 --> 00:16:07.270
>> I think it's the same thing.
00:16:07.270 --> 00:16:09.640
>> All right, probably right.
00:16:09.640 --> 00:16:12.655
So here just a walk-through,
00:16:12.655 --> 00:16:15.790
and I'm not going to go
through all of this but
00:16:15.790 --> 00:16:19.585
basically steps on how to go
through and talk to the back-end.
00:16:19.585 --> 00:16:22.450
This is an example that
it's common for some of
00:16:22.450 --> 00:16:25.945
these single-page
application systems to just,
00:16:25.945 --> 00:16:27.550
they don't even- since you're just
00:16:27.550 --> 00:16:29.230
talking to a back-end anywhere they
00:16:29.230 --> 00:16:33.550
can talk to a Cloud
provider for the back-end.
00:16:33.550 --> 00:16:35.260
>> I wonder if this is the same
thing or I wonder if it's a
00:16:35.260 --> 00:16:39.130
different entering the docs, I
haven't looked at it before.
00:16:39.130 --> 00:16:40.510
Because it's interesting that
00:16:40.510 --> 00:16:42.610
that screenshot you just
showed had two options,
00:16:42.610 --> 00:16:44.650
one was real-time and one- yeah,
00:16:44.650 --> 00:16:48.310
realtime Database which is what
Firebase was so famous for.
00:16:48.310 --> 00:16:49.945
Then it has Firestore,
00:16:49.945 --> 00:16:51.775
always the next generation.
00:16:51.775 --> 00:16:54.055
There you go. It's the better one.
00:16:54.055 --> 00:16:56.200
Yeah, this looks it's
the new Firebase.
00:16:56.200 --> 00:17:01.285
If you go to the website it's
firebase.Google.com/docs/firestore.
00:17:01.285 --> 00:17:03.550
So it is Firebase. Okay. Cool.
00:17:03.550 --> 00:17:10.900
>> Okay, Shahad here
continuing his mega-series,
00:17:10.900 --> 00:17:13.765
here's looking at handling
errors in ASP.NET Core.
00:17:13.765 --> 00:17:17.230
This is a soup to nuts
on handling errors.
00:17:17.230 --> 00:17:20.245
So it starts with basic
error handling in C-sharp,
00:17:20.245 --> 00:17:23.110
just the basic error
handling try-catch stuff,
00:17:23.110 --> 00:17:24.820
building all the way up.
00:17:24.820 --> 00:17:29.035
So looking at, and I'm going to
skip ahead a little bit here,
00:17:29.035 --> 00:17:30.730
error handling in MVC,
00:17:30.730 --> 00:17:36.080
reminders about the error
model and error view,
00:17:36.840 --> 00:17:39.490
and customizable, of course.
00:17:39.490 --> 00:17:40.540
>> Yeah.
00:17:40.540 --> 00:17:43.300
>> A reader pointed out,
00:17:43.300 --> 00:17:46.450
also looking at web API and
00:17:46.450 --> 00:17:52.135
Global Error Handling or
global errors in Web API,
00:17:52.135 --> 00:17:55.165
and then also looking at error
handling in Razor pages,
00:17:55.165 --> 00:17:58.105
and similarities and
minor differences.
00:17:58.105 --> 00:18:00.445
Then he goes through and
talks about logging errors.
00:18:00.445 --> 00:18:05.200
So this is a great reminder just
on error handling in general.
00:18:05.200 --> 00:18:06.370
>> It's' good, it's
actually interesting.
00:18:06.370 --> 00:18:08.515
We just did some experience reviews
00:18:08.515 --> 00:18:10.675
and stuff in 3.0 In
the meeting before this.
00:18:10.675 --> 00:18:12.280
One of the things that I have to love
00:18:12.280 --> 00:18:13.870
is we're going to make
some improvements.
00:18:13.870 --> 00:18:16.090
The improvements have [inaudible]
it for a while around
00:18:16.090 --> 00:18:19.930
the exception page and the error
handler limit [inaudible] there.
00:18:19.930 --> 00:18:22.990
We still have that issue where
if you're doing, for example,
00:18:22.990 --> 00:18:26.080
API development and you
throw an exception,
00:18:26.080 --> 00:18:28.780
you get back the developer
exception page which
00:18:28.780 --> 00:18:31.630
is HTML if you've got that configured
in your development [inaudible]
00:18:31.630 --> 00:18:32.755
>> Right.
00:18:32.755 --> 00:18:37.240
>> By default, our controller that we
00:18:37.240 --> 00:18:39.580
add to those project
templates for doing
00:18:39.580 --> 00:18:41.920
the error handling in
the production scenario,
00:18:41.920 --> 00:18:46.345
it just returns a view
00:18:46.345 --> 00:18:49.225
and the API one doesn't do
anything special at all,
00:18:49.225 --> 00:18:51.880
which is unfortunate because we
have Problem Details Support now
00:18:51.880 --> 00:18:54.550
which we added in 2.1
and 2.2, we improved it.
00:18:54.550 --> 00:18:56.170
So we have a proposal for how
00:18:56.170 --> 00:18:57.820
we can hook all this
things together in
00:18:57.820 --> 00:19:01.405
3.0 so that both
the developer exception page
00:19:01.405 --> 00:19:05.680
and the error handler
00:19:05.680 --> 00:19:07.120
middleware can work in
00:19:07.120 --> 00:19:10.000
conjunction with
other things in the system.
00:19:10.000 --> 00:19:11.710
So that a thing can register and say,
00:19:11.710 --> 00:19:13.150
"Hey, I can handle the exceptions.
00:19:13.150 --> 00:19:15.100
Please call me back if
you see an exception.
00:19:15.100 --> 00:19:16.735
Give me the context and
give me the exception,
00:19:16.735 --> 00:19:18.595
and I'll tell you whether
I can handle it."
00:19:18.595 --> 00:19:20.650
That way, it will make the
system a lot more pluggable,
00:19:20.650 --> 00:19:22.060
and one of the things
we'll be able to achieve
00:19:22.060 --> 00:19:24.820
is if the client
doesn't support HTML,
00:19:24.820 --> 00:19:26.830
we wont' return HTML.
00:19:26.830 --> 00:19:29.290
If it was an API that failed,
00:19:29.290 --> 00:19:32.335
we'll do [inaudible] for you and
we'll run it through a formatter.
00:19:32.335 --> 00:19:36.490
We'll do a problem details response
which would be in the app,
00:19:36.490 --> 00:19:38.350
you return a problem
details are an exception,
00:19:38.350 --> 00:19:40.210
and then it'll run through
the formatter pipeline,
00:19:40.210 --> 00:19:41.770
you'll get the right response
for the client that's calling.
00:19:41.770 --> 00:19:43.435
So we're actually going
to fix that in 3.0,
00:19:43.435 --> 00:19:45.835
that is what I'm asserting
today hopefully.
00:19:45.835 --> 00:19:46.870
>> That's great.
00:19:46.870 --> 00:19:47.410
>> Yeah.
00:19:47.410 --> 00:19:49.780
>> I was trying to think when
I saw that most recently,
00:19:49.780 --> 00:19:50.950
and it was when you and I were both
00:19:50.950 --> 00:19:52.630
during that workshop in London,
00:19:52.630 --> 00:19:56.620
and we were debugging
things in, what is it?
00:19:56.620 --> 00:19:58.210
The [inaudible] debugging page?
00:19:58.210 --> 00:19:59.930
>> Yeah.
00:20:00.090 --> 00:20:02.260
>> If something's not working,
00:20:02.260 --> 00:20:03.280
you get your response,
00:20:03.280 --> 00:20:05.530
and it's a bunch of ugly,
00:20:05.530 --> 00:20:07.810
like stack trace that
you're trying to read,
00:20:07.810 --> 00:20:10.270
and it's formatted in HTML,
00:20:10.270 --> 00:20:11.545
and it's in text.
00:20:11.545 --> 00:20:14.185
Yeah, there you go, I would
love to see that updated.
00:20:14.185 --> 00:20:17.440
Cool. So good job,
Chad, that's awesome.
00:20:17.440 --> 00:20:22.210
This one, this is from Philip,
00:20:22.210 --> 00:20:24.250
and here, he's talking
about a few tips
00:20:24.250 --> 00:20:27.310
on handling JSON requests
in ASP.NET Core.
00:20:27.310 --> 00:20:32.260
This is down to the metal
a little bit it seemed like to me,
00:20:32.260 --> 00:20:34.480
but he's talking about
some things like don't buffer to
00:20:34.480 --> 00:20:37.585
string, don't do sync.
00:20:37.585 --> 00:20:42.070
He goes through
some specific things in here,
00:20:42.070 --> 00:20:44.995
for Kestrel, for disabling
synchronous I/O.
00:20:44.995 --> 00:20:47.140
>> There's a history to that
if you want to hear it.
00:20:47.140 --> 00:20:48.415
>> I would love to.
00:20:48.415 --> 00:20:50.395
>> So synchronous and
asynchronous I/O,
00:20:50.395 --> 00:20:54.050
we all hopefully by now
understand the difference.
00:20:54.750 --> 00:20:58.150
A synchronous I/O is
where you make a call to
00:20:58.150 --> 00:21:00.550
some system that does
input output over the network,
00:21:00.550 --> 00:21:02.590
or database, or file,
and you've blocked
00:21:02.590 --> 00:21:04.900
the thread until that has finished.
00:21:04.900 --> 00:21:06.730
Asynchronous I/O is the same thing
00:21:06.730 --> 00:21:07.990
except instead of
blocking the thread,
00:21:07.990 --> 00:21:11.455
you release the thread while
that I/O operation is running.
00:21:11.455 --> 00:21:13.330
Then when the I/O operation finishes,
00:21:13.330 --> 00:21:16.510
the system will schedule
your completion,
00:21:16.510 --> 00:21:18.460
which is usually the rest
of the statement
00:21:18.460 --> 00:21:21.010
after the await keyword in C-sharp,
00:21:21.010 --> 00:21:22.750
to run on a thread.
00:21:22.750 --> 00:21:24.400
It may not be the same thread,
it will be a different thread,
00:21:24.400 --> 00:21:26.365
or it will get scheduled, and
the thread pool will handle that.
00:21:26.365 --> 00:21:31.615
Okay. The problem a lot
of the time with async,
00:21:31.615 --> 00:21:32.950
and we've talked about this in
00:21:32.950 --> 00:21:34.390
the talks that David and I have done,
00:21:34.390 --> 00:21:37.030
and also David has
a great repo with a bunch of
00:21:37.030 --> 00:21:40.390
examples of these things that can
trip you up, is that sometimes,
00:21:40.390 --> 00:21:41.920
you can end up doing synchronous,
00:21:41.920 --> 00:21:44.500
blocking I/O even when
you don't realize because
00:21:44.500 --> 00:21:47.965
of the way that
certain things get wrapped.
00:21:47.965 --> 00:21:52.150
So for example, if
you might be writing
00:21:52.150 --> 00:21:54.580
to a response stream
of some sort and then
00:21:54.580 --> 00:21:57.100
you intend to flush asynchronously,
00:21:57.100 --> 00:21:58.795
or you're writing Asynchronously,
00:21:58.795 --> 00:22:00.220
but then it hasn't actually
00:22:00.220 --> 00:22:02.170
flushed yet because of
the way buffering works,
00:22:02.170 --> 00:22:06.160
and then you don't call
a discrete flush async,
00:22:06.160 --> 00:22:07.375
you just can't let it happen.
00:22:07.375 --> 00:22:10.510
Then the thing unwinds and
then eventually gets disposed,
00:22:10.510 --> 00:22:13.300
but disposed is a synchronous call.
00:22:13.300 --> 00:22:15.280
So you end up having data
00:22:15.280 --> 00:22:17.050
in the buffer that hasn't
been written yet to
00:22:17.050 --> 00:22:18.910
the underlying stream
because you went through
00:22:18.910 --> 00:22:21.130
a structure that will
be disposed eventually,
00:22:21.130 --> 00:22:23.560
and you didn't explicitly
flush it ahead of time.
00:22:23.560 --> 00:22:26.560
So the dispose call
actually makes a call to
00:22:26.560 --> 00:22:30.760
flush a sync and blocks on your
behalf, which you didn't realize.
00:22:30.760 --> 00:22:34.660
So those type of things and make
it very difficult to say, "Yes,
00:22:34.660 --> 00:22:37.990
I've moved all my code
to async and hence,
00:22:37.990 --> 00:22:41.230
I will not hit any of those scale
issues that occur when I
00:22:41.230 --> 00:22:44.590
have an async system that hits
a synchronous code path."
00:22:44.590 --> 00:22:46.315
Because the problem with
synchronous code paths
00:22:46.315 --> 00:22:47.710
over asynchronous code path,
00:22:47.710 --> 00:22:49.000
especially when it's like async over
00:22:49.000 --> 00:22:51.055
sync over async as we call it,
00:22:51.055 --> 00:22:52.810
is that instead of
using one thread to
00:22:52.810 --> 00:22:54.580
complete the item for
that period of time,
00:22:54.580 --> 00:22:57.190
you can actually end up
using multiple threads,
00:22:57.190 --> 00:23:00.670
like three or four or even more
depending how deep the stack goes,
00:23:00.670 --> 00:23:02.425
to do the same amount of work.
00:23:02.425 --> 00:23:06.880
So you end up saying instead of
running out of threads in time in,
00:23:06.880 --> 00:23:09.190
you can run out of threads
in four or five or six
00:23:09.190 --> 00:23:11.620
times quicker than you
would have otherwise done,
00:23:11.620 --> 00:23:13.600
because of the way
these things interact.
00:23:13.600 --> 00:23:17.995
So in 2.0, I think it was
2.0 or maybe it was 2.1,
00:23:17.995 --> 00:23:20.395
I had asked the team whether we could
00:23:20.395 --> 00:23:24.160
literally disable
synchronous I/O in Kestrel by
00:23:24.160 --> 00:23:26.800
default so that if you try to call
00:23:26.800 --> 00:23:30.340
write instead of write
async, it would throw.
00:23:30.340 --> 00:23:32.500
Or if you try to read
from the request body,
00:23:32.500 --> 00:23:34.420
because that's also
a huge security problem,
00:23:34.420 --> 00:23:36.220
because if you're making
blocking calls when
00:23:36.220 --> 00:23:38.290
you're reading request bodies,
00:23:38.290 --> 00:23:40.420
if you don't have
limits on those calls,
00:23:40.420 --> 00:23:42.460
it's going to be very
easy for the client
00:23:42.460 --> 00:23:44.410
to block a thread indefinitely,
00:23:44.410 --> 00:23:45.805
because they can just send a byte
00:23:45.805 --> 00:23:49.735
every 30 seconds depending on
what [inaudible] are set to.
00:23:49.735 --> 00:23:52.405
Then you can just easily use up
all the threads on the server,
00:23:52.405 --> 00:23:53.620
and there are things
like [inaudible] and
00:23:53.620 --> 00:23:54.805
other types of attacks that do this.
00:23:54.805 --> 00:23:56.890
We have protections in
Kestrel now to do [inaudible]
00:23:56.890 --> 00:23:59.230
did all that back in 2.0
and 2.1 as you recall,
00:23:59.230 --> 00:24:01.600
which is why it's now
supported as an Edge server.
00:24:01.600 --> 00:24:03.970
So I said why don't we
00:24:03.970 --> 00:24:06.430
just block synchronous I/O
by default in Kestrel?
00:24:06.430 --> 00:24:09.025
So they tried, they added
the feature, you can see it here.
00:24:09.025 --> 00:24:10.645
The problem is when
we set it to true,
00:24:10.645 --> 00:24:14.020
very few things worked,
so anything real.
00:24:14.020 --> 00:24:15.370
Soon as you plugged in MVC,
00:24:15.370 --> 00:24:17.050
you tried to read a JSON request,
00:24:17.050 --> 00:24:20.455
because the JSON serializer
itself is synchronous,
00:24:20.455 --> 00:24:22.945
it would end up blocking,
00:24:22.945 --> 00:24:25.270
and it would end up trying to read
synchronously from the string.
00:24:25.270 --> 00:24:27.040
Because the way it works is you
create the JSON serializer,
00:24:27.040 --> 00:24:28.990
you pass it the request
stream, so here,
00:24:28.990 --> 00:24:31.285
I want you to deserialize
from this stream,
00:24:31.285 --> 00:24:35.710
and then it reads from the request
stream as it's serializing.
00:24:35.710 --> 00:24:37.090
But it doesn't do it asynchronously,
00:24:37.090 --> 00:24:39.475
it just calls stream
to read effectively.
00:24:39.475 --> 00:24:41.620
So you wind up getting
a synchronous read even
00:24:41.620 --> 00:24:42.790
though you were going
through the right
00:24:42.790 --> 00:24:44.050
mechanisms in the framework.
00:24:44.050 --> 00:24:45.910
The JSON serializer just
wasn't the only one,
00:24:45.910 --> 00:24:47.650
there's a whole bunch of
places that end up doing this.
00:24:47.650 --> 00:24:50.110
So fast forward to today,
00:24:50.110 --> 00:24:54.145
we're actually looking to turn this
on by default in 3.0 and we've
00:24:54.145 --> 00:24:56.590
systematically worked
through all these areas
00:24:56.590 --> 00:24:58.555
that prevented us doing it last time,
00:24:58.555 --> 00:24:59.950
and one of them being building
00:24:59.950 --> 00:25:04.330
a new JSON serializer
to ensure that we can
00:25:04.330 --> 00:25:05.680
have a good experience out of
00:25:05.680 --> 00:25:10.630
the box and have synchronous I/O
turned off by default.
00:25:10.630 --> 00:25:12.940
I'm not saying you
won't hit a problem,
00:25:12.940 --> 00:25:15.040
we still find things
in the framework,
00:25:15.040 --> 00:25:16.870
our customers find
things in the framework,
00:25:16.870 --> 00:25:18.580
and we get them fixed
for the next version,
00:25:18.580 --> 00:25:22.660
where some API that looks like
it's async ends up going down into
00:25:22.660 --> 00:25:24.700
a stack that is actually doing
00:25:24.700 --> 00:25:27.280
a synchronous block on
top of an async API,
00:25:27.280 --> 00:25:30.370
which is really bad and that
causes massive scale issues.
00:25:30.370 --> 00:25:32.350
In this case, it would mean it would
00:25:32.350 --> 00:25:33.865
potentially, depending
on what it was doing,
00:25:33.865 --> 00:25:35.350
it might just fail
[inaudible] own exception,
00:25:35.350 --> 00:25:36.610
because Kestrel will
go, "No, you tried to
00:25:36.610 --> 00:25:38.410
call a synchronous API,
we're not going to let you."
00:25:38.410 --> 00:25:41.935
So anyway, that's
the long story behind
00:25:41.935 --> 00:25:47.050
that particular flag and why
it's still set to a true today,
00:25:47.050 --> 00:25:49.315
but we're trying to get it
set to false by default.
00:25:49.315 --> 00:25:51.640
>> Okay. Yeah, funny,
00:25:51.640 --> 00:25:54.235
I was debating like "Is
this a good one to show?"
00:25:54.235 --> 00:25:55.780
I'm so glad I did because there,
00:25:55.780 --> 00:25:59.235
we get all that information
and context. Good stuff.
00:25:59.235 --> 00:26:03.480
Okay, two more. We've got
one from Andrew Lock.
00:26:03.480 --> 00:26:05.340
So most of the time,
00:26:05.340 --> 00:26:08.865
his have been pretty in-depth
lately, pretty advanced.
00:26:08.865 --> 00:26:11.280
This is a great kind
of overview of ASP.
00:26:11.280 --> 00:26:12.480
Net Core Razor pages.
00:26:12.480 --> 00:26:15.610
This is a good intro if you or
00:26:15.610 --> 00:26:19.600
your team is not using Razor
pages or is more used to MVC,
00:26:19.600 --> 00:26:22.105
and this explains the thinking.
00:26:22.105 --> 00:26:26.620
He's got lots of great diagrams
in here mapping what you end
00:26:26.620 --> 00:26:30.430
up doing with MVC,
00:26:30.430 --> 00:26:31.840
you get this kind of proliferation,
00:26:31.840 --> 00:26:35.515
you get all this mapping
of views and controllers.
00:26:35.515 --> 00:26:37.450
He talks about also
00:26:37.450 --> 00:26:42.580
the issue with mapping
a lot of different actions.
00:26:42.580 --> 00:26:45.490
So then just explaining the thinking
00:26:45.490 --> 00:26:48.220
through when you'd use Razor pages,
00:26:48.220 --> 00:26:51.595
he talks about how the model works,
00:26:51.595 --> 00:26:54.880
and he also, later on,
00:26:54.880 --> 00:26:57.220
talks about mapping different routing
00:26:57.220 --> 00:26:58.885
and then mapping different verbs,
00:26:58.885 --> 00:27:02.120
so just a great overview.
00:27:02.130 --> 00:27:04.450
In addition, there's already
00:27:04.450 --> 00:27:06.820
good documentation and
all that kind of stuff,
00:27:06.820 --> 00:27:09.490
but I feel like this is
a really clear explanation
00:27:09.490 --> 00:27:10.990
if you're used to MVC,
00:27:10.990 --> 00:27:14.870
if you're comfortable with MVC
and you want to understand.
00:27:14.880 --> 00:27:17.170
I feel like this is just great.
00:27:17.170 --> 00:27:18.055
>> That's great.
00:27:18.055 --> 00:27:20.350
>> Yeah. Andrew's
a very clear writer.
00:27:20.350 --> 00:27:23.320
He's good at breaking down
00:27:23.320 --> 00:27:26.440
complex topics and being
very technically correct,
00:27:26.440 --> 00:27:30.355
and yet, also very clear and concise.
00:27:30.355 --> 00:27:32.305
>> It makes me happy that people are
00:27:32.305 --> 00:27:34.660
still taking the time
to write these type
00:27:34.660 --> 00:27:36.430
of posts about Razor pages given
00:27:36.430 --> 00:27:39.005
it's been around for years right now.
00:27:39.005 --> 00:27:41.320
>> Yeah. Look what I
just noticed here.
00:27:41.320 --> 00:27:45.385
>> Dark theme? That's just too cool.
00:27:45.385 --> 00:27:46.870
>> Dark theme.
00:27:46.870 --> 00:27:50.230
>> I loved here, you know
what he did there, it's not-
00:27:50.230 --> 00:27:52.700
>> It's fading too, right?
00:27:52.950 --> 00:27:56.410
>> That reminds me Shawn Wilderness.
00:27:56.410 --> 00:27:58.360
You say still I have on a
00:27:58.360 --> 00:28:01.420
slightly very slowly
turn to look at you.
00:28:01.420 --> 00:28:04.930
>> Yes, he had an animated GIF
as his portfolio picture, right?
00:28:04.930 --> 00:28:10.975
>> Okay. I think I may have
featured two from Gunnar.
00:28:10.975 --> 00:28:13.870
I'm not sure. Gunnar pavement here.
00:28:13.870 --> 00:28:16.810
This is an automated
date-based versioning
00:28:16.810 --> 00:28:18.160
for ASP.NET Core assemblies.
00:28:18.160 --> 00:28:19.630
So you've done this in the past
00:28:19.630 --> 00:28:21.730
where you're stamping
into the footer of
00:28:21.730 --> 00:28:23.260
the page like actually on the live
00:28:23.260 --> 00:28:25.390
ASP.Net site, it does this where-
00:28:25.390 --> 00:28:27.865
>> In the comments, if you
actually go to it now and you
00:28:27.865 --> 00:28:30.985
go into the source of the homepage,
00:28:30.985 --> 00:28:35.890
you'll see a whole bunch of stuff
in HTML comments in the source,
00:28:35.890 --> 00:28:37.360
DVU source down at the bottom.
00:28:37.360 --> 00:28:41.200
>> Let's do it. This is inception
here. Your page source.
00:28:41.200 --> 00:28:42.655
>> Yeah, go right to the bottom,
00:28:42.655 --> 00:28:43.900
all the way to the bottom.
00:28:43.900 --> 00:28:46.060
Then zoom in on
that block at the bottom.
00:28:46.060 --> 00:28:49.750
>> I've copied inside to this on
the.Net Foundation website too.
00:28:49.750 --> 00:28:53.245
>> Yeah. I read a bunch of hacky,
00:28:53.245 --> 00:28:56.635
took me three months code to figure
out how to get all that stuff.
00:28:56.635 --> 00:28:59.035
>> Yeah, and I stole it.
00:28:59.035 --> 00:29:00.985
>> Because that's what you do.
00:29:00.985 --> 00:29:03.550
>> Yeah. So but what he's done here,
00:29:03.550 --> 00:29:05.365
I think this is a little bit
kind of front area.
00:29:05.365 --> 00:29:06.550
This is a nice approach.
00:29:06.550 --> 00:29:08.800
Here, he's doing using
00:29:08.800 --> 00:29:12.805
Azure DevOps and he's
versioning based on the date.
00:29:12.805 --> 00:29:15.640
So what that ends up giving you is
00:29:15.640 --> 00:29:19.420
a nice little your
version that you're
00:29:19.420 --> 00:29:23.380
stamping is like 2019.02.07.1.
00:29:23.380 --> 00:29:24.340
>> That's cool.
00:29:24.340 --> 00:29:26.860
>> Yes. So, it's incremental by day.
00:29:26.860 --> 00:29:29.410
So if you have multiple
builds in a day-
00:29:29.410 --> 00:29:31.735
>> So, he does that as
the assembly version?
00:29:31.735 --> 00:29:32.320
>> Yeah.
00:29:32.320 --> 00:29:34.840
>> Okay. So I mean you have
to be careful with that,
00:29:34.840 --> 00:29:37.795
with regards to what
you apply that to.
00:29:37.795 --> 00:29:39.760
I think the applications
it's probably perfectly
00:29:39.760 --> 00:29:42.550
fine but for libraries,
00:29:42.550 --> 00:29:45.190
if they used.Net framework
and things like that,
00:29:45.190 --> 00:29:48.700
assembly version has
semantic meaning when
00:29:48.700 --> 00:29:50.650
it once you throw strong naming
00:29:50.650 --> 00:29:52.720
and all types of other stuff
in the servicing environment.
00:29:52.720 --> 00:29:54.190
Most of this stuff applies more to
00:29:54.190 --> 00:29:56.110
the stuff that we shipped than
it does to the general public.
00:29:56.110 --> 00:29:59.380
But assembly binding,
binding redirects,
00:29:59.380 --> 00:30:00.625
and all those type of
things that you know
00:30:00.625 --> 00:30:02.530
many folks complain
about all the time.
00:30:02.530 --> 00:30:03.970
Because when it works,
00:30:03.970 --> 00:30:06.490
it's fine and when something
goes wrong, it's horrific.
00:30:06.490 --> 00:30:09.265
Those things are based
on these versions,
00:30:09.265 --> 00:30:11.200
and so you want to make
sure you think very
00:30:11.200 --> 00:30:13.570
consciously about what you're
using for your assembly versions.
00:30:13.570 --> 00:30:15.730
As I said, for apps,
typically it's fine.
00:30:15.730 --> 00:30:17.305
You can change it
every single build and that's
00:30:17.305 --> 00:30:19.255
that's generally the white thing.
That's what you want to do.
00:30:19.255 --> 00:30:20.980
The other way of doing
this is that rather than
00:30:20.980 --> 00:30:22.690
putting it in the assembly
version directly,
00:30:22.690 --> 00:30:24.520
which is what he's doing
here, you can put it in
00:30:24.520 --> 00:30:28.255
the assembly informational version
which is just a text field.
00:30:28.255 --> 00:30:29.815
Then you can put whatever you earn.
00:30:29.815 --> 00:30:32.830
For example the libraries
that we ship from Microsoft,
00:30:32.830 --> 00:30:36.880
we, the assembly version generally
matches the branding version.
00:30:36.880 --> 00:30:39.130
So you to R1, to R2,
00:30:39.130 --> 00:30:42.520
to R3 using some various classes
we can for the component.
00:30:42.520 --> 00:30:45.325
Then the information
version we stamp in
00:30:45.325 --> 00:30:48.640
the NuGet package version,
which can be different,
00:30:48.640 --> 00:30:50.530
because if it's a preview
the NuGet package version
00:30:50.530 --> 00:30:51.670
will have dashed preview on it,
00:30:51.670 --> 00:30:53.470
which he can't put in
the assembly version,
00:30:53.470 --> 00:30:56.890
because the assembly
version is a.Net idiom.
00:30:56.890 --> 00:30:58.630
It's a thing that
doesn't support previews
00:30:58.630 --> 00:31:01.015
and semantic versioning
to that extent.
00:31:01.015 --> 00:31:03.460
Then there's an extra field
that we use to
00:31:03.460 --> 00:31:06.610
stamping legacy assembly description
we stamp into get shot.
00:31:06.610 --> 00:31:09.940
So we use a series of
different fields to do so.
00:31:09.940 --> 00:31:13.150
What's nice about some of
these fields that you may or may not
00:31:13.150 --> 00:31:16.855
know is that if you have
the Assembly in Windows Explorer,
00:31:16.855 --> 00:31:18.412
you can right mouse
click on the "Assembly,"
00:31:18.412 --> 00:31:19.480
go to the "File Properties,"
00:31:19.480 --> 00:31:23.380
and then there's a tab that
shows you-all of these things.
00:31:23.380 --> 00:31:26.140
So you don't have to crack it
open in [inaudible] or anything.
00:31:26.140 --> 00:31:28.225
You can just look at it in
Explorer and you can see
00:31:28.225 --> 00:31:31.270
the assembly version and the
informational version which is nice.
00:31:31.270 --> 00:31:36.205
>> Yeah I think that's
the details, the assembly details.
00:31:36.205 --> 00:31:37.450
>> Yeah.
00:31:37.450 --> 00:31:39.220
>> Yeah. That's awesome. Well, cool.
00:31:39.220 --> 00:31:41.515
So that's useful to know.
00:31:41.515 --> 00:31:42.790
So like you said,
00:31:42.790 --> 00:31:44.230
if you're sitting at
the top of the stack,
00:31:44.230 --> 00:31:45.430
then you conversion at
00:31:45.430 --> 00:31:49.540
the assembly nice kind
of pretty, I put there.
00:31:49.540 --> 00:31:51.595
Yeah, very cool.
00:31:51.595 --> 00:31:53.410
I think that's it.
00:31:53.410 --> 00:31:56.155
The last thing here
is say view source.
00:31:56.155 --> 00:31:59.650
Yes, I'm done loving in
the community for today.
00:31:59.650 --> 00:32:01.750
Let me well- No I mean.
00:32:01.750 --> 00:32:03.460
>> Well, I'd love to ask.
00:32:03.460 --> 00:32:05.995
There's no more community
love to give, he says.
00:32:05.995 --> 00:32:07.855
Quick, someone
rather brackets and put on.
00:32:07.855 --> 00:32:09.370
Well. So, what have we been doing?
00:32:09.370 --> 00:32:11.920
So I have switched on
when we shipped 2.2,
00:32:11.920 --> 00:32:13.390
that was in early December,
00:32:13.390 --> 00:32:15.205
which was my focus for a while,
00:32:15.205 --> 00:32:19.330
and then you and I and
a whole bunch of us actually
00:32:19.330 --> 00:32:23.905
went to London and we did
in DC London in January.
00:32:23.905 --> 00:32:26.785
We taught how famed workshop now.
00:32:26.785 --> 00:32:28.930
We taught our workshop. It was
our new version of our workshop.
00:32:28.930 --> 00:32:30.520
We updated it for 2.2,
00:32:30.520 --> 00:32:34.310
which took us some time
to do, which is good.
00:32:34.310 --> 00:32:36.820
>> I mean, we did also
00:32:36.820 --> 00:32:39.490
some things that really should
have been done even for 2.1.
00:32:39.490 --> 00:32:41.530
Like I feel like we
updated some stuff,
00:32:41.530 --> 00:32:44.515
the better data loading,
that was really cool.
00:32:44.515 --> 00:32:47.860
I mean, that's something that's
been halfway for a while.
00:32:47.860 --> 00:32:49.840
>> Yeah. I think David
and I took a year
00:32:49.840 --> 00:32:51.970
off last year in terms of
teaching and traveling.
00:32:51.970 --> 00:32:53.890
So, other people had
00:32:53.890 --> 00:32:56.530
updated the workshop as
part of delivering it.
00:32:56.530 --> 00:32:58.300
So, we got to see some
of those updates for
00:32:58.300 --> 00:33:00.280
the first time but we didn't apply
00:33:00.280 --> 00:33:02.050
the updates that
perhaps we would've as
00:33:02.050 --> 00:33:03.970
the feature owners going to
know about this feature.
00:33:03.970 --> 00:33:06.325
So it was good to get
back in there and go,
00:33:06.325 --> 00:33:07.510
"Let's change it
through this and this,
00:33:07.510 --> 00:33:10.090
and we update the material," and
then we had a good workshop.
00:33:10.090 --> 00:33:12.850
I think we were like
17 people. Was at 16?
00:33:12.850 --> 00:33:15.280
>> About 17, and
really good interaction.
00:33:15.280 --> 00:33:16.450
>> Great interaction. It was
00:33:16.450 --> 00:33:18.940
a different group to
last year in London.
00:33:18.940 --> 00:33:21.145
Last year, I think it's
fair to say we had
00:33:21.145 --> 00:33:24.565
folks who were somewhat quite
familiar with.Net Core.
00:33:24.565 --> 00:33:26.905
Generally speaking, we always
have a few new comers.
00:33:26.905 --> 00:33:28.105
This time out of the 17,
00:33:28.105 --> 00:33:29.770
I mean like 15 of them
are were all .Net
00:33:29.770 --> 00:33:32.110
framework developers who haven't
really done.Net Core yet,
00:33:32.110 --> 00:33:35.170
and they were very young
enterprising-styled developers
00:33:35.170 --> 00:33:36.760
coming from all of Europe.
00:33:36.760 --> 00:33:38.650
So, it was a very different vibe
and it was really good.
00:33:38.650 --> 00:33:41.380
So, we had a lot of those how do I
00:33:41.380 --> 00:33:44.110
do this in.Net Core
questions and why do we make
00:33:44.110 --> 00:33:47.440
those changes type questions
and folks seeing a lot of
00:33:47.440 --> 00:33:51.310
the changes for the first time
in anger in this type of space.
00:33:51.310 --> 00:33:52.630
Then we had a couple
of people who were a
00:33:52.630 --> 00:33:53.740
little more advanced and so they
00:33:53.740 --> 00:33:55.060
offered a different
perspective when we
00:33:55.060 --> 00:33:56.440
got different questions from them.
00:33:56.440 --> 00:33:58.375
So it was a really really good,
00:33:58.375 --> 00:34:02.215
I think it was a good iteration
of the workshop that we've done.
00:34:02.215 --> 00:34:04.840
Then because it was
that type of crowd,
00:34:04.840 --> 00:34:07.270
we ended up not even getting
through all the modules.
00:34:07.270 --> 00:34:08.470
I think in the full two days,
00:34:08.470 --> 00:34:10.060
we end up getting the model six.
00:34:10.060 --> 00:34:11.770
But there's a seven
and an eight and we
00:34:11.770 --> 00:34:13.255
didn't even get to
the rear end of the design,
00:34:13.255 --> 00:34:14.410
this design to work that way.
00:34:14.410 --> 00:34:16.795
So it's designed that
you can cut it off.
00:34:16.795 --> 00:34:17.845
>> More than enough.
00:34:17.845 --> 00:34:18.580
>> Yeah. More than that.
00:34:18.580 --> 00:34:19.585
>> We can send them
home with homework.
00:34:19.585 --> 00:34:21.790
>> Exactly. So I think
it went really well
00:34:21.790 --> 00:34:24.220
and there's still things
about the app I would change,
00:34:24.220 --> 00:34:25.600
and we will continue to do so,
00:34:25.600 --> 00:34:28.120
and we'll we'll teach it again,
but it went really well.
00:34:28.120 --> 00:34:29.860
Then we did a couple of talks.
00:34:29.860 --> 00:34:31.450
I don't know if you'd share this and
00:34:31.450 --> 00:34:33.310
the previous ones at all but
most of them are live now,
00:34:33.310 --> 00:34:34.360
which I think you're also at Live
00:34:34.360 --> 00:34:35.905
this week. I tweeted it yesterday.
00:34:35.905 --> 00:34:37.915
>> Yeah, I didn't.
00:34:37.915 --> 00:34:40.240
I'll include those for next week.
00:34:40.240 --> 00:34:42.160
Yeah. All of our talks are-
00:34:42.160 --> 00:34:43.945
>> So all the in DC,
London talks are now live,
00:34:43.945 --> 00:34:46.300
but the ones that we gave as
Microsoft employees but also
00:34:46.300 --> 00:34:50.050
all the speakers who gave about
various topics which is great.
00:34:50.050 --> 00:34:54.160
So I gave a talk with
David on ASP.NET Core 2.2,
00:34:54.160 --> 00:34:56.500
and then David gave a talk with me,
00:34:56.500 --> 00:35:01.360
as in he love to talk and
I was just there to offer
00:35:01.360 --> 00:35:03.145
comments every now and then
00:35:03.145 --> 00:35:06.460
about why you're a ASP.NET
Core application went scale.
00:35:06.460 --> 00:35:08.530
That was a follow-up talk
to the one we did last year
00:35:08.530 --> 00:35:11.170
about all the issues you
might run into at Async,
00:35:11.170 --> 00:35:13.180
and scaling, and
how the hard pole works,
00:35:13.180 --> 00:35:14.230
and blah, blah, blah.
00:35:14.230 --> 00:35:15.985
So that was a lot of fun as well.
00:35:15.985 --> 00:35:20.650
Then you gave a talk
titled, what was it called?
00:35:20.650 --> 00:35:23.350
>> I called it ASP.NET
Core one hour makeover.
00:35:23.350 --> 00:35:24.850
>> Makeover. That was
the term I was looking for.
00:35:24.850 --> 00:35:26.710
>> Yeah. I gave
00:35:26.710 --> 00:35:28.660
a similar talking in DC Sydney
00:35:28.660 --> 00:35:30.640
and I have been
continuing to evolve it,
00:35:30.640 --> 00:35:32.770
and it's the what you do
00:35:32.770 --> 00:35:35.440
the first hour after right
filing new projects.
00:35:35.440 --> 00:35:36.310
>> That's cool.
00:35:36.310 --> 00:35:39.670
>> Yeah. So there's some things
like features to turn on,
00:35:39.670 --> 00:35:43.630
setting up your health
checks and your unit tests,
00:35:43.630 --> 00:35:46.960
some things like I converted
the JavaScript libraries
00:35:46.960 --> 00:35:50.410
over these LibMan and showed
you based on the menu usage.
00:35:50.410 --> 00:35:52.465
The funny thing is,
00:35:52.465 --> 00:35:55.090
I build up this thing over
the course of an hour showing
00:35:55.090 --> 00:35:59.950
all these ways to set up
and make it your own.
00:35:59.950 --> 00:36:02.410
Turn on features that are off by
00:36:02.410 --> 00:36:05.815
default but there's likely
you'll want to use.
00:36:05.815 --> 00:36:08.020
Then at the very end of it,
00:36:08.020 --> 00:36:09.355
I show how to create
00:36:09.355 --> 00:36:13.975
your own project template
using the template system.
00:36:13.975 --> 00:36:15.460
So it's a really cool like,
00:36:15.460 --> 00:36:18.130
"Hey we just spent an hour but
look how we can shrink it down,
00:36:18.130 --> 00:36:20.980
and you can reuse this,"
and write as I was
00:36:20.980 --> 00:36:24.655
showing that my computer restarted.
00:36:24.655 --> 00:36:27.520
It wasn't even a blue screen,
it just restarted.
00:36:27.520 --> 00:36:28.990
It wasn't a Windows Update,
00:36:28.990 --> 00:36:31.285
it was just for the heck of it.
00:36:31.285 --> 00:36:35.110
I have not had my computer
do that and I maybe years.
00:36:35.110 --> 00:36:38.035
I don't remember my computer
just spontaneously rebooting.
00:36:38.035 --> 00:36:40.750
So I didn't get to show my grand.
00:36:40.750 --> 00:36:42.640
>> That is super unfortunate.
00:36:42.640 --> 00:36:44.740
So we had a lot about the talks.
00:36:44.740 --> 00:36:48.490
We had actually another workshop.
00:36:48.490 --> 00:36:51.295
We went two workshops for
the first time from our team.
00:36:51.295 --> 00:36:54.070
So we had a Blazer workshop
for the first time,
00:36:54.070 --> 00:36:56.005
and this wasn't a Razor
components workshops
00:36:56.005 --> 00:36:57.160
like the stuff for shipping to throw.
00:36:57.160 --> 00:36:59.530
This was a genuine Blazer workshop.
00:36:59.530 --> 00:37:01.990
So, we had Steve Sanderson,
00:37:01.990 --> 00:37:05.380
and Dan Roth, and Ryan Novak.
00:37:05.380 --> 00:37:08.560
The architect, the Lead Dev,
00:37:08.560 --> 00:37:10.540
and the PM for Blazer,
00:37:10.540 --> 00:37:12.660
the [inaudible] as well.
00:37:12.660 --> 00:37:14.885
Teaching a workshop which was cool.
00:37:14.885 --> 00:37:16.700
>> I got to say they put together
00:37:16.700 --> 00:37:18.575
a really solid looking workshop too.
00:37:18.575 --> 00:37:19.940
I mean, it's very professionally.
00:37:19.940 --> 00:37:20.330
>> Yeah.
00:37:20.330 --> 00:37:20.660
>> Yeah.
00:37:20.660 --> 00:37:22.310
>> Yeah, it's like
a pizza delivery app with
00:37:22.310 --> 00:37:25.475
a real-time drone delivery
of the pizza and stuff.
00:37:25.475 --> 00:37:27.410
Then, we had Dan gave talks as well.
00:37:27.410 --> 00:37:29.540
So, I think Dan gave a talk
on Razor components,
00:37:29.540 --> 00:37:30.950
which is the stuff coming in 3.0,
00:37:30.950 --> 00:37:33.155
and then Steve gave his very nerve,
00:37:33.155 --> 00:37:35.300
very polished Blazer talk,
00:37:35.300 --> 00:37:37.340
which kind of introduces Blazer
and what it's all about and
00:37:37.340 --> 00:37:38.420
why it exists and how web assembly
00:37:38.420 --> 00:37:39.815
works and all types of
things which is cool.
00:37:39.815 --> 00:37:45.560
And then [inaudible] gave a version of
his hacking diabetes talk, I think.
00:37:45.560 --> 00:37:46.790
And he gave a version
of the Microsoft
00:37:46.790 --> 00:37:48.680
open-source journey talk as well.
00:37:48.680 --> 00:37:52.130
Then we also saw Mads gave a talk
00:37:52.130 --> 00:37:55.715
about C sharp stuff
and C sharp eight.
00:37:55.715 --> 00:37:58.970
I think Phillip Kata was there,
00:37:58.970 --> 00:38:01.280
I'm assuming he was
talking about F sharp.
00:38:01.280 --> 00:38:03.050
And who else was there?
00:38:03.050 --> 00:38:05.100
Who else was from the team?
00:38:05.560 --> 00:38:09.120
Bob.
00:38:09.120 --> 00:38:09.590
>>Bill Wagner.
00:38:09.590 --> 00:38:13.640
>>Bill Wagner, sorry, did
another C-sharp talk.
00:38:13.640 --> 00:38:16.460
And then who else was there?
00:38:16.460 --> 00:38:19.220
There was a whole bunch of
us. Seth Juarez was there.
00:38:19.220 --> 00:38:21.305
I don't know if he did
a talk. Did he do a talk?
00:38:21.305 --> 00:38:23.870
Rob Connery was there. I
believe he did a talk as well.
00:38:23.870 --> 00:38:24.440
>>He did.
00:38:24.440 --> 00:38:26.450
>>Yeah. So, there was a lot
of good content this year.
00:38:26.450 --> 00:38:28.055
And then obviously there was a lot of
00:38:28.055 --> 00:38:29.510
great content from the non Microsoft
00:38:29.510 --> 00:38:30.680
speakers as well as
there always there.
00:38:30.680 --> 00:38:32.660
So, those videos are all up on
00:38:32.660 --> 00:38:34.190
YouTube now and I think you
00:38:34.190 --> 00:38:35.870
can get to them through
the MDC website as well.
00:38:35.870 --> 00:38:38.015
You can just search
on YouTube to do so.
00:38:38.015 --> 00:38:41.480
So, that happened and and now
my focus is really on Three O.
00:38:41.480 --> 00:38:43.250
So, we've shipped two previews,
00:38:43.250 --> 00:38:45.470
we shipped the second preview,
while we were there.
00:38:45.470 --> 00:38:47.780
The third preview is imminent.
00:38:47.780 --> 00:38:50.600
It was going to come out
this week but I think it's
00:38:50.600 --> 00:38:53.510
been delayed because we had
a build issue or something,
00:38:53.510 --> 00:38:57.905
so they're hoping now that
preview will come out next week.
00:38:57.905 --> 00:39:01.145
And our intent is to get a preview
out roughly every month.
00:39:01.145 --> 00:39:02.900
And I think it's going to
be a blog post coming out
00:39:02.900 --> 00:39:04.490
very shortly that talks
about this for Three O.
00:39:04.490 --> 00:39:06.065
We want to be a little bit more open.
00:39:06.065 --> 00:39:08.555
We tend to have a little back
and forth with marketing.
00:39:08.555 --> 00:39:11.120
It's like how open can we be
about when we plan to release?
00:39:11.120 --> 00:39:13.040
Well, we want to hold some stuff,
00:39:13.040 --> 00:39:15.620
so we try and come up
with words that keep
00:39:15.620 --> 00:39:17.975
both sides of the company happy.
00:39:17.975 --> 00:39:19.565
But you can just watch GitHub
00:39:19.565 --> 00:39:21.455
you can usually figure out where
things are going to happen,
00:39:21.455 --> 00:39:25.700
but we're going to have quite a
number of previews for Three O's.
00:39:25.700 --> 00:39:27.110
So if you think back
to the one O days,
00:39:27.110 --> 00:39:29.180
we had like eight biders I think.
00:39:29.180 --> 00:39:32.150
We called them biders back then
before we did the first RC.
00:39:32.150 --> 00:39:34.010
It'll be more like that for Three O.
00:39:34.010 --> 00:39:36.815
We're going to try and get a preview
out pretty much every month.
00:39:36.815 --> 00:39:38.165
We did the first one in December,
00:39:38.165 --> 00:39:39.620
we did the second one in January,
00:39:39.620 --> 00:39:42.005
the third one was going
to be in February,
00:39:42.005 --> 00:39:43.640
which is this week, but I
think we are going to miss
00:39:43.640 --> 00:39:45.695
it by a few days. It
will be early next week.
00:39:45.695 --> 00:39:47.870
And then I think
the fourth preview might be
00:39:47.870 --> 00:39:50.270
very soon after that
because we don't want to
00:39:50.270 --> 00:39:53.795
then leak into
the VS 2019 launch window
00:39:53.795 --> 00:39:57.545
which I think you said is
April 2nd. Is that right?
00:39:57.545 --> 00:39:59.360
>> Yeah, April 2nd.
00:39:59.360 --> 00:40:04.415
>> Right and so then preview four
will be probably before that.
00:40:04.415 --> 00:40:06.680
Maybe it'll be after,
we'll see where it lands,
00:40:06.680 --> 00:40:08.960
but there's sort of a few weeks
there where we're kind of not,
00:40:08.960 --> 00:40:10.940
it's not in our best interest
to try and land
00:40:10.940 --> 00:40:13.490
a preview in the middle
of a huge launch.
00:40:13.490 --> 00:40:15.845
And then after that
there's a conference
00:40:15.845 --> 00:40:17.900
and so maybe we'll have
a preview for the conference,
00:40:17.900 --> 00:40:19.640
but I wouldn't know
anything about that,
00:40:19.640 --> 00:40:22.730
a conference that begins with a B
that we hold here in Seattle.
00:40:22.730 --> 00:40:23.720
>> Yes.
00:40:23.720 --> 00:40:26.075
>> And then there will be
more previews after that.
00:40:26.075 --> 00:40:28.490
And then we still intend to try and
00:40:28.490 --> 00:40:32.585
get Three O finished later this year.
00:40:32.585 --> 00:40:35.345
I think we are saying
about late Q three.
00:40:35.345 --> 00:40:37.730
So, Q three means
the third quarter of the year.
00:40:37.730 --> 00:40:41.540
So, sometime from July
to September but late.
00:40:41.540 --> 00:40:43.970
I don't like saying
summer. Sometimes we do
00:40:43.970 --> 00:40:45.260
the North-American thing or
00:40:45.260 --> 00:40:46.940
the northern hemisphere thing
and then we say coming to you in
00:40:46.940 --> 00:40:49.820
fall or coming to you in
late summer and that's not very
00:40:49.820 --> 00:40:51.500
friendly because there is half of
00:40:51.500 --> 00:40:53.930
the world that doesn't have
the same seasons as us.
00:40:53.930 --> 00:40:57.110
So, late Q three is what
we're currently shooting for.
00:40:57.110 --> 00:40:59.450
It's not a promise
though for Three O.
00:40:59.450 --> 00:41:01.040
So, the next preview,
00:41:01.040 --> 00:41:04.385
preview three, I have a build.
00:41:04.385 --> 00:41:06.140
It's not the build
because there is a bunch
00:41:06.140 --> 00:41:07.910
of stuff held up in the
build system right now,
00:41:07.910 --> 00:41:10.610
but I have Friday is build I think
00:41:10.610 --> 00:41:13.400
and Friday is build has
some stuff that is worth showing.
00:41:13.400 --> 00:41:14.810
So, let me switch over.
00:41:14.810 --> 00:41:17.540
And some of you may have seen
00:41:17.540 --> 00:41:20.150
Fala has been tweeting
a couple of these things,
00:41:20.150 --> 00:41:23.915
a little snippets and generating
some excitement which is great.
00:41:23.915 --> 00:41:25.655
So, let me show you some stuff.
00:41:25.655 --> 00:41:28.265
We've all seen the file New
[inaudible] 2019 by now.
00:41:28.265 --> 00:41:30.335
And if you haven't, you have
now because it's right here.
00:41:30.335 --> 00:41:32.240
I'm going to click
"Create New Project."
00:41:32.240 --> 00:41:37.129
This is the new what they
called the NDP or the NPD,
00:41:37.129 --> 00:41:39.050
The New Project Dialog in
00:41:39.050 --> 00:41:42.080
VS and it's very much different
than what it was before.
00:41:42.080 --> 00:41:44.105
Rather than a huge tree
view on the left,
00:41:44.105 --> 00:41:45.605
they're trying to
simplify it and just
00:41:45.605 --> 00:41:47.915
give you a list and let you search.
00:41:47.915 --> 00:41:50.750
We have not properly
integrated with this yet.
00:41:50.750 --> 00:41:54.485
And we will do that as
part of the Three O wave.
00:41:54.485 --> 00:41:57.800
But Three O does not
ship with VS 2019.
00:41:57.800 --> 00:42:00.050
That should have been
obvious based on
00:42:00.050 --> 00:42:02.150
everything I just said for
the last five minutes because you
00:42:02.150 --> 00:42:04.850
just got finished saying
that VS 2019 will ship on
00:42:04.850 --> 00:42:06.950
April 2nd and I just
got finished saying
00:42:06.950 --> 00:42:09.455
that.NET Core3 will
ship in late Q three.
00:42:09.455 --> 00:42:11.000
Those are obviously different dates.
00:42:11.000 --> 00:42:12.470
So, if you did think
they were going to
00:42:12.470 --> 00:42:14.240
land together, I'm sorry they're not.
00:42:14.240 --> 00:42:16.145
They were never intended
to land together.
00:42:16.145 --> 00:42:19.520
And so, we will integrate
into this experience
00:42:19.520 --> 00:42:23.915
better after VS 2019 ships.
00:42:23.915 --> 00:42:26.390
For example if I type
"Razor" in here,
00:42:26.390 --> 00:42:29.585
you get some stuff like
it actually it just says,
00:42:29.585 --> 00:42:31.310
you can build
next Core Web Application.
00:42:31.310 --> 00:42:33.110
That's because it says
create Razor pages.
00:42:33.110 --> 00:42:36.500
But if I want to find something
like GRPC which I know exists now,
00:42:36.500 --> 00:42:38.840
there is no template for
it here which is a lie.
00:42:38.840 --> 00:42:40.820
There is actually
a GRPC template but it's
00:42:40.820 --> 00:42:43.025
hidden behind the 1ASP.NET dialogue.
00:42:43.025 --> 00:42:45.860
So, I have to go in and say
ASP.NET Core Web Application,
00:42:45.860 --> 00:42:48.980
hit "Next" accept
these things and then I get
00:42:48.980 --> 00:42:51.050
the 1ASP.NET Core dialogue
00:42:51.050 --> 00:42:53.555
where we have a further
set of templates,
00:42:53.555 --> 00:42:56.360
a slight refinement
on what you selected.
00:42:56.360 --> 00:42:59.600
We are going to basically
move all of these templates
00:42:59.600 --> 00:43:02.420
from here into that first screen.
Well, not all of them.
00:43:02.420 --> 00:43:04.670
We might do some consolidation
but generally speaking,
00:43:04.670 --> 00:43:07.130
so that these will interact
with the new experience.
00:43:07.130 --> 00:43:10.085
So there it is, the GRPC service
that we talked about.
00:43:10.085 --> 00:43:12.410
They're also going to take
a chance to rename a lot of these
00:43:12.410 --> 00:43:13.460
and we'll reorder them because it's
00:43:13.460 --> 00:43:14.870
all a bit higgledy-piggledy
right now.
00:43:14.870 --> 00:43:16.850
We haven't really
given it the attention
00:43:16.850 --> 00:43:18.755
it needs to yet at this stage.
00:43:18.755 --> 00:43:20.180
You can see that this one is using
00:43:20.180 --> 00:43:22.880
the same icon as empty
which is probably wrong.
00:43:22.880 --> 00:43:25.010
And Razor components is higher than
00:43:25.010 --> 00:43:27.080
web application which
is also probably wrong.
00:43:27.080 --> 00:43:32.160
Oh my goodness! Is that a Hanselman
I see conjuring before us.
00:43:34.600 --> 00:43:37.025
>> I was at the dentist.
00:43:37.025 --> 00:43:38.360
>> You were at the dentist?
00:43:38.360 --> 00:43:38.960
>> Yeah.
00:43:38.960 --> 00:43:40.025
>> Look at you.
00:43:40.025 --> 00:43:42.050
>> I have to go regularly
to the dentist.
00:43:42.050 --> 00:43:43.715
>> I was supposed to go
00:43:43.715 --> 00:43:45.770
before I went to Hawaii and
you know what happened?
00:43:45.770 --> 00:43:48.380
We got snowed in, so I didn't get
to go and I have to reschedule.
00:43:48.380 --> 00:43:50.780
>> But you go to the dentist
like every nine years.
00:43:50.780 --> 00:43:52.940
>> No, it's changed now. I have
00:43:52.940 --> 00:43:55.805
been every six months
now twice in a row.
00:43:55.805 --> 00:43:58.370
>> Do you remember when
you told me that you
00:43:58.370 --> 00:44:00.905
hadn't been to the doctor
in like 26 years?
00:44:00.905 --> 00:44:02.990
What did I do? I recoiled in horror.
00:44:02.990 --> 00:44:04.910
>> He did recoil in horror and I
00:44:04.910 --> 00:44:07.205
am happy to say that
I went to the doctor
00:44:07.205 --> 00:44:10.040
in December and I was
00:44:10.040 --> 00:44:13.010
supposed to go for my annual that
I hadn't done for three years.
00:44:13.010 --> 00:44:15.710
And then I was supposed
to go to the dentist for
00:44:15.710 --> 00:44:17.300
my cleaning two weeks ago
00:44:17.300 --> 00:44:18.710
but I got snowed in and
I have to reschedule.
00:44:18.710 --> 00:44:20.210
>> Did the doctor, he or
00:44:20.210 --> 00:44:22.415
she say that you were
the pinnacle of health.
00:44:22.415 --> 00:44:24.710
>> She did actually give me that type
00:44:24.710 --> 00:44:26.240
of summary which is
00:44:26.240 --> 00:44:27.920
nice but I'm supposed to
have my blood work done.
00:44:27.920 --> 00:44:29.420
I haven't done it yet.
So, I have to go off and
00:44:29.420 --> 00:44:31.535
schedule my blood work
just to be sure.
00:44:31.535 --> 00:44:33.665
>> I want to see your blood work.
I go to the doctor weekly
00:44:33.665 --> 00:44:35.450
which you think may be overkill.
00:44:35.450 --> 00:44:37.145
>> Well, I'm not going to judge.
00:44:37.145 --> 00:44:42.140
I'll judge you silently. I've lost
00:44:42.140 --> 00:44:44.390
20 pounds in the last year so I'm
feeling pretty good about that.
00:44:44.390 --> 00:44:47.690
>> I was told that I am as
healthy as a very thin ox.
00:44:47.690 --> 00:44:53.210
Very frail, fragile ox
that moves gingerly.
00:44:53.210 --> 00:44:55.055
>> That's fantastic.
00:44:55.055 --> 00:44:55.895
>> Could you please continue?
00:44:55.895 --> 00:44:56.390
>> Yes.
00:44:56.390 --> 00:44:57.275
>> I apologize.
00:44:57.275 --> 00:44:59.945
>> I just wanted to acknowledge
your presence here.
00:44:59.945 --> 00:45:01.745
All right. So back to
what I was talking about.
00:45:01.745 --> 00:45:03.425
So we have, yeah.
00:45:03.425 --> 00:45:04.310
So we've got some work to do on
00:45:04.310 --> 00:45:05.690
these templates here
but they are there.
00:45:05.690 --> 00:45:07.670
In the next preview, you will
see a couple of new things.
00:45:07.670 --> 00:45:10.220
We added Razor components in
Preview two but we now have
00:45:10.220 --> 00:45:13.220
gRPC and we have the all powerful,
00:45:13.220 --> 00:45:15.770
all new worker service templates.
00:45:15.770 --> 00:45:17.615
So we're basically introducing
00:45:17.615 --> 00:45:21.260
a completely new workload
type or project type.
00:45:21.260 --> 00:45:22.610
We call them workloads internally.
00:45:22.610 --> 00:45:23.810
Like what workload is that?
00:45:23.810 --> 00:45:26.855
Is it WinForms or is it mobile
or is it Xamarin or whatever.
00:45:26.855 --> 00:45:29.000
So worker service is
an acknowledgment that
00:45:29.000 --> 00:45:31.325
there is a type of
app that you build.
00:45:31.325 --> 00:45:33.695
That is a console app
00:45:33.695 --> 00:45:35.060
but you don't just
00:45:35.060 --> 00:45:36.845
want a console app, that's
like do everything yourself.
00:45:36.845 --> 00:45:39.650
Like it's a console app
that uses the power
00:45:39.650 --> 00:45:43.550
of all the ASP.NET Core,
Microsoft.Extensions stuff.
00:45:43.550 --> 00:45:46.475
So here I am inside my program,
00:45:46.475 --> 00:45:48.245
in my program file,
00:45:48.245 --> 00:45:50.315
and I've got my CreateHostBuilder
00:45:50.315 --> 00:45:51.740
and instead of CreateWebHostBuilder,
00:45:51.740 --> 00:45:54.410
which was what had in
in 21 and 22 and so
00:45:54.410 --> 00:45:57.740
this all looks the same as an
ASP.NET Core app at the moment,
00:45:57.740 --> 00:45:59.180
except there is
no startup class because I
00:45:59.180 --> 00:46:01.055
don't need one, because
it's not as complicated.
00:46:01.055 --> 00:46:02.840
I just go into configure
services and I've
00:46:02.840 --> 00:46:04.445
added a thing called
a hosted service.
00:46:04.445 --> 00:46:05.660
Now, hosted services is not new.
00:46:05.660 --> 00:46:06.740
We had those before.
00:46:06.740 --> 00:46:08.405
They were just not very well
00:46:08.405 --> 00:46:10.625
known because we didn't
have a template for it.
00:46:10.625 --> 00:46:12.170
There's only minimal docs but this
00:46:12.170 --> 00:46:13.505
is an acknowledgment that there are
00:46:13.505 --> 00:46:16.640
architectures where you have
many of these styles of apps.
00:46:16.640 --> 00:46:17.825
They don't have a server in them.
00:46:17.825 --> 00:46:22.220
They sit in a Kubernetes Pods
or they sit as an Azure
00:46:22.220 --> 00:46:24.470
Function or they sit as a VM
00:46:24.470 --> 00:46:26.870
or just an app or web job
maybe in Antares.
00:46:26.870 --> 00:46:29.285
They sit there and they
go, "Every two minutes,
00:46:29.285 --> 00:46:31.100
I'm going to wake up
and check to see if
00:46:31.100 --> 00:46:32.930
there's any e-mail to
send from this database
00:46:32.930 --> 00:46:38.390
table" or they subscribe to an
Azure Storage Queue and they go,
00:46:38.390 --> 00:46:40.820
"Oh, I'm going to dequeue
00:46:40.820 --> 00:46:42.380
messages and I'm going
to do some processing.
00:46:42.380 --> 00:46:45.530
I'm going to send this over to this
other thing," or they react to
00:46:45.530 --> 00:46:49.130
storage changes using Event Grid
in Azure or whatever it might be.
00:46:49.130 --> 00:46:52.055
The point is that there are
apps that are long-running.
00:46:52.055 --> 00:46:53.840
So you want lifecycle for them,
00:46:53.840 --> 00:46:54.980
you want dependency
injection, you want
00:46:54.980 --> 00:46:56.120
logging, you want configuration,
00:46:56.120 --> 00:46:57.680
you want all the goodness
that we did for ASP.NET
00:46:57.680 --> 00:47:00.170
Core but they don't have an endpoint.
00:47:00.170 --> 00:47:03.410
>> You said, File,
New worker service.
00:47:03.410 --> 00:47:05.045
>> Worker service is what
we're calling it right now.
00:47:05.045 --> 00:47:09.545
>> But then you say, hosted service
here but then you named the-
00:47:09.545 --> 00:47:11.165
>> The thing a worker.
00:47:11.165 --> 00:47:12.785
>> I find that confusing.
00:47:12.785 --> 00:47:15.740
>> That's a perfectly
reasonable and valid feedback.
00:47:15.740 --> 00:47:18.320
So let me pull it apart
a little bit and I'll explain why
00:47:18.320 --> 00:47:19.490
that is but then you can tell me
00:47:19.490 --> 00:47:21.140
that's garbage and we
should change it anyway.
00:47:21.140 --> 00:47:23.330
So the worker in this case is
00:47:23.330 --> 00:47:25.550
the thing that does
the work, in this case.
00:47:25.550 --> 00:47:27.290
So my worker classes in
00:47:27.290 --> 00:47:30.980
this project and this work,
it doesn't do much.
00:47:30.980 --> 00:47:32.945
It just sits in a wild loop and
00:47:32.945 --> 00:47:36.185
asynchronously waits every second
and then prints out a message.
00:47:36.185 --> 00:47:39.365
It's the most basic worker
you could do in the world.
00:47:39.365 --> 00:47:45.440
The hosting part, this
part at a hosted service.
00:47:45.440 --> 00:47:48.650
This is a primitive of a DI system.
00:47:48.650 --> 00:47:50.240
So now hosting system,
00:47:50.240 --> 00:47:51.725
the application hosting system.
00:47:51.725 --> 00:47:53.975
So you can say in DI,
00:47:53.975 --> 00:47:55.970
I want you to add a class that
00:47:55.970 --> 00:47:58.280
conforms to a particular interface
and in this case,
00:47:58.280 --> 00:48:00.440
it's background service and
00:48:00.440 --> 00:48:03.320
background service
implements ihostedservice.
00:48:03.320 --> 00:48:07.400
ihostedservice is simply a class
that's registered in DI that will
00:48:07.400 --> 00:48:09.110
get notified about the lifetime of
00:48:09.110 --> 00:48:11.510
the application. It's
as simple as that.
00:48:11.510 --> 00:48:14.270
So it is a service that
is hosted by the host.
00:48:14.270 --> 00:48:16.430
So that's the very core layer
and then you can
00:48:16.430 --> 00:48:19.550
build multiple workload
types on a hosted system.
00:48:19.550 --> 00:48:23.045
So we build web apps on
the same hosting infrastructure,
00:48:23.045 --> 00:48:27.845
and then we build worker apps
or gRPC apps or SignalR apps,
00:48:27.845 --> 00:48:32.285
all on the same hosting idiom.
00:48:32.285 --> 00:48:35.360
Yeah, so we know there
are customers today using
00:48:35.360 --> 00:48:38.375
web applications that have hosted
services in the background,
00:48:38.375 --> 00:48:40.895
that just do things in the
background of the web application.
00:48:40.895 --> 00:48:42.530
It doesn't make them worker apps.
00:48:42.530 --> 00:48:46.220
So the term worker
00:48:46.220 --> 00:48:48.080
is more being used to describe
00:48:48.080 --> 00:48:49.880
when you have a specific application,
00:48:49.880 --> 00:48:51.395
its job is just to sit there
00:48:51.395 --> 00:48:53.675
and do a thing that
isn't be a server.
00:48:53.675 --> 00:48:55.940
>> All right. So then
let me ask you this.
00:48:55.940 --> 00:48:59.360
If I just want to
make a.NET Core app,
00:48:59.360 --> 00:49:00.680
that's a console app.
00:49:00.680 --> 00:49:01.370
>> Yes.
00:49:01.370 --> 00:49:03.650
>> That I run as
a human occasionally.
00:49:03.650 --> 00:49:03.890
>> Yes.
00:49:03.890 --> 00:49:05.150
>> But it's not hosted.
00:49:05.150 --> 00:49:05.510
>> Correct.
00:49:05.510 --> 00:49:07.130
>> But I want all of the love.
00:49:07.130 --> 00:49:07.760
>> Yes.
00:49:07.760 --> 00:49:09.905
>> Is that considered a rare thing?
00:49:09.905 --> 00:49:11.480
>> No, not at all. So I mean,
00:49:11.480 --> 00:49:12.965
you could totally do
that here, right.
00:49:12.965 --> 00:49:14.990
>> Okay, but there's nothing here.
00:49:14.990 --> 00:49:16.610
I would still have
to emotionally work
00:49:16.610 --> 00:49:18.590
past the understanding
of what a worker is,
00:49:18.590 --> 00:49:19.850
what a host is, and then
00:49:19.850 --> 00:49:21.755
accept that I just won't
be using that stuff.
00:49:21.755 --> 00:49:23.480
So then the question
is, why don't you take
00:49:23.480 --> 00:49:28.160
the DI bits and make that less
ASP.NET and make it more.NET Core.
00:49:28.160 --> 00:49:30.125
>> So we did that from the beginning.
00:49:30.125 --> 00:49:32.000
So the thing you have
to remember about DI
00:49:32.000 --> 00:49:34.565
though is that DI implies a lifetime.
00:49:34.565 --> 00:49:36.770
So who is hosting the container.
00:49:36.770 --> 00:49:37.390
>> There you go. There's what I'm-
00:49:37.390 --> 00:49:39.080
>> Who is hosting the container?
00:49:39.080 --> 00:49:41.300
>> Right. If the console is-
00:49:41.300 --> 00:49:43.700
>> That's right. You could
00:49:43.700 --> 00:49:45.995
take independency injection
as a dependency.
00:49:45.995 --> 00:49:49.055
It kind of sounds strange,
and just use it directly.
00:49:49.055 --> 00:49:50.360
It wouldn't be very pretty.
00:49:50.360 --> 00:49:52.710
It's really intended to
be hosted like, and-
00:49:52.710 --> 00:49:53.030
>> Right.
00:49:53.030 --> 00:49:53.960
>> -that's why we have a hosting-
00:49:53.960 --> 00:49:55.640
>> But if I go file
a new console app and I just
00:49:55.640 --> 00:49:58.155
want dependency injection
for tidiness.
00:49:58.155 --> 00:50:00.790
>> That's difficult because who's
going to activate your types.
00:50:00.790 --> 00:50:04.010
Like you tend to have to have
a framework that understands.
00:50:04.010 --> 00:50:04.730
>> You need the host.
00:50:04.730 --> 00:50:06.620
>> You need a host. You
need a hosting paradigm.
00:50:06.620 --> 00:50:07.910
You need an application model.
00:50:07.910 --> 00:50:11.240
So this is the application model
for these types of applications.
00:50:11.240 --> 00:50:12.650
If you wanted to build
00:50:12.650 --> 00:50:14.720
a console app that boots
up, does some work,
00:50:14.720 --> 00:50:16.700
and then exits immediately but you
00:50:16.700 --> 00:50:19.145
wanted DI as the composition
model for doing that,
00:50:19.145 --> 00:50:20.540
you could do that with this.
00:50:20.540 --> 00:50:21.755
You would just have to hook up
00:50:21.755 --> 00:50:23.600
the end part. You would
have to have a trigger.
00:50:23.600 --> 00:50:24.680
>> This is in the Preview three.
00:50:24.680 --> 00:50:26.090
>>This is in Preview three.
00:50:26.090 --> 00:50:27.215
>> Lovely.
00:50:27.215 --> 00:50:28.805
>> So this will be in Preview three.
00:50:28.805 --> 00:50:30.830
>> I'm surprised
the chats aren't louder.
00:50:30.830 --> 00:50:32.090
I want to hear what
the people on chat
00:50:32.090 --> 00:50:33.830
say because I think
this is extraordinary.
00:50:33.830 --> 00:50:35.090
>> Yeah, and so again,
00:50:35.090 --> 00:50:38.300
we intend, we're seeing
customers do this already.
00:50:38.300 --> 00:50:42.365
A lot of this is about acknowledging
where customers are already.
00:50:42.365 --> 00:50:43.580
So I've said all, we're introducing
00:50:43.580 --> 00:50:44.945
a new workload, blah, blah, blah.
00:50:44.945 --> 00:50:47.840
What we're really doing is codifying
what people are doing already
00:50:47.840 --> 00:50:50.690
and then looking at what they're
doing and just making it better.
00:50:50.690 --> 00:50:52.760
As in saying, well, we're going
to reduce some boilerplate by
00:50:52.760 --> 00:50:54.890
building some idioms for you
in the platform that do that,
00:50:54.890 --> 00:50:57.275
and just recognizing this as
the type of project that people do.
00:50:57.275 --> 00:50:59.675
So when we talk to
customers who have large,
00:50:59.675 --> 00:51:03.395
distributed/microservices style
architecture applications,
00:51:03.395 --> 00:51:05.570
you will often end
up with projects or
00:51:05.570 --> 00:51:08.420
applications running in
that system, that do this.
00:51:08.420 --> 00:51:10.730
They just sit there and they
dequeue from some type of
00:51:10.730 --> 00:51:12.200
Event Grid thing and
then they post to
00:51:12.200 --> 00:51:14.375
a SQL database and
that's all they do.
00:51:14.375 --> 00:51:16.820
This is that. This is for
those type of things.
00:51:16.820 --> 00:51:18.380
All right, and I'm sure that people
00:51:18.380 --> 00:51:19.970
will look at this and
as you just said,
00:51:19.970 --> 00:51:21.380
"Go what, I pulled
the part this bit though.
00:51:21.380 --> 00:51:22.970
I could use it for
other stuff as well."
00:51:22.970 --> 00:51:24.800
Greatness, that's fantastic.
00:51:24.800 --> 00:51:26.240
We may not have
a template for you out of
00:51:26.240 --> 00:51:27.410
the box that looks exactly like that.
00:51:27.410 --> 00:51:28.850
But now we've got one more,
00:51:28.850 --> 00:51:30.350
that is much easier to get going
00:51:30.350 --> 00:51:31.730
with and starting with a console app,
00:51:31.730 --> 00:51:33.110
like you said, or
starting with a web app
00:51:33.110 --> 00:51:34.370
and then removing all the web stuff,
00:51:34.370 --> 00:51:35.825
which there is not much fun.
00:51:35.825 --> 00:51:37.970
All right, so the other new one,
00:51:37.970 --> 00:51:42.950
I wanted to show quickly
was gRPC and so John,
00:51:42.950 --> 00:51:44.000
you showed that blog post,
00:51:44.000 --> 00:51:46.115
which is great because
it was published today.
00:51:46.115 --> 00:51:48.320
By who was it? Was that Steve?
00:51:48.320 --> 00:51:49.070
>> Steve Gordon.
00:51:49.070 --> 00:51:51.500
>> Gordon, yes. So here it is, gRPC.
00:51:51.500 --> 00:51:54.500
So what we're doing with gRPC,
for folks who don't know,
00:51:54.500 --> 00:51:58.985
gRPC was a thing put
together by folks at Google,
00:51:58.985 --> 00:52:05.495
and the G stands for a Google
and the rest stands for RPC.
00:52:05.495 --> 00:52:08.195
It effectively combines
a bunch of technologies
00:52:08.195 --> 00:52:12.455
into a stack and so you get HTTP2,
00:52:12.455 --> 00:52:14.390
which gives you a single
connection with lots of
00:52:14.390 --> 00:52:16.520
multiplexing and goodness so that you
00:52:16.520 --> 00:52:18.470
don't have to have lots and
lots of TCP connections to do
00:52:18.470 --> 00:52:23.690
simultaneous RPC calls and
then it uses Protobuf,
00:52:23.690 --> 00:52:27.500
which is the binary
serialization format and
00:52:27.500 --> 00:52:30.170
then.proto files as the specification
00:52:30.170 --> 00:52:32.240
for the message types that
you go forward and backward.
00:52:32.240 --> 00:52:33.935
So if I create one of these,
00:52:33.935 --> 00:52:37.055
and there is a gRPC solution
for.NET today.
00:52:37.055 --> 00:52:41.150
It's just it doesn't use
any ASP.NET Core stuff.
00:52:41.150 --> 00:52:44.030
Like if you go and get
gRPC.NET today from Google,
00:52:44.030 --> 00:52:47.360
it's a thin veneer of
00:52:47.360 --> 00:52:49.160
managed code that calls out into
00:52:49.160 --> 00:52:51.140
all their native libraries.
They wrote it in C.
00:52:51.140 --> 00:52:53.240
>> Right. It's the WinForms
over the top of
00:52:53.240 --> 00:52:55.510
P/Invoking of Win32. It's quite-
00:52:55.510 --> 00:52:55.985
>> I'm not-
00:52:55.985 --> 00:52:56.930
>> It's not, it's dramatic.
00:52:56.930 --> 00:52:59.975
>> I'm not even done anywhere
near as integrated as that.
00:52:59.975 --> 00:53:02.780
>> Yeah, it's quite light. I
don't think they coach it.
00:53:02.780 --> 00:53:05.345
>> Yeah, and that was the philosophy.
00:53:05.345 --> 00:53:06.440
So what we've done is like, "Well,
00:53:06.440 --> 00:53:08.405
yeah customers are already
using gRPC or they're
00:53:08.405 --> 00:53:10.880
asking what should I use for RPC?"
00:53:10.880 --> 00:53:13.460
Because there's no WCF in.NET
Core and so we're like,
00:53:13.460 --> 00:53:15.650
"Well, let's embrace something
00:53:15.650 --> 00:53:17.210
that's already out there
and doing really well."
00:53:17.210 --> 00:53:20.030
So we're actually working
with the Google folks and
00:53:20.030 --> 00:53:23.720
we're building stuff that is
going into their repository.
00:53:23.720 --> 00:53:27.215
So if I go and look at the dependencies
of this project over here.
00:53:27.215 --> 00:53:29.120
So this one at the moment,
00:53:29.120 --> 00:53:31.310
this template creates you
both the server and client.
00:53:31.310 --> 00:53:33.560
Because gRPC includes a tooling story
00:53:33.560 --> 00:53:35.960
as part of the stack
that generates you
00:53:35.960 --> 00:53:37.940
the server code and generates you
00:53:37.940 --> 00:53:41.240
the client proxy or the client agent
to call that server.
00:53:41.240 --> 00:53:44.120
It's very tightly coupled.
That's why it's RPC,
00:53:44.120 --> 00:53:47.510
it's not HTTP and plus
JSON style loosey-goosey.
00:53:47.510 --> 00:53:49.580
It's very much, I have
a client, I have a server.
00:53:49.580 --> 00:53:52.130
There's a contract and I
just want them to work.
00:53:52.130 --> 00:53:55.280
It's a little more like
DCOM or the old style
00:53:55.280 --> 00:53:56.930
WCF with a TCP binding
00:53:56.930 --> 00:53:58.955
and strong service contracts
and things like that.
00:53:58.955 --> 00:54:01.400
So in the NuGet here,
we see a bunch of
00:54:01.400 --> 00:54:04.130
Google stuff and then here's
the one that we're building.
00:54:04.130 --> 00:54:06.395
So Grpc.AspNetCore.Server.
00:54:06.395 --> 00:54:09.650
That lives in the gRPC repo
but we're building it,
00:54:09.650 --> 00:54:12.770
and then we're helping them
with the tools part of it,
00:54:12.770 --> 00:54:14.570
and we're offering
improvements and working with
00:54:14.570 --> 00:54:16.910
them on that to integrate this as
00:54:16.910 --> 00:54:18.830
well as we think is possible
00:54:18.830 --> 00:54:20.930
into the idiomatic ways
that you would
00:54:20.930 --> 00:54:25.625
do so in a.NET project using
MSBuild and all that type of stuff.
00:54:25.625 --> 00:54:26.930
So how does that work?
00:54:26.930 --> 00:54:28.220
Actually here, so what that mean,
00:54:28.220 --> 00:54:31.010
is that this an ASP.NET
Core application.
00:54:31.010 --> 00:54:32.420
If I go to program, it's
00:54:32.420 --> 00:54:33.830
the same type of stuff
that we saw before.
00:54:33.830 --> 00:54:36.140
It's using a web builder
and it has a startup class.
00:54:36.140 --> 00:54:38.825
If I go to the startup class,
it is middleware.
00:54:38.825 --> 00:54:40.550
You can see the
middleware, right here.
00:54:40.550 --> 00:54:42.500
Then I have in my routing call,
00:54:42.500 --> 00:54:44.090
which is the new endpoint routing in
00:54:44.090 --> 00:54:45.920
3O that we've talked
about a couple of times.
00:54:45.920 --> 00:54:48.120
I will just Zoom in
a little bit here.
00:54:48.180 --> 00:54:51.025
Then we've got this MapGrpcService.
00:54:51.025 --> 00:54:53.920
So, I've got a strongly typed
service, my GreeterService,
00:54:53.920 --> 00:54:56.980
which is right here, which
is a class in my project,
00:54:56.980 --> 00:54:58.225
which is in the services folder,
00:54:58.225 --> 00:55:01.450
and it inherits from
the generated code that
00:55:01.450 --> 00:55:06.130
the gRPC tool chain created
for me from that Core Base.
00:55:06.130 --> 00:55:08.095
Now, I'm getting an error
because I haven't built it yet,
00:55:08.095 --> 00:55:10.675
and that Core doesn't exist
until the tool chain runs,
00:55:10.675 --> 00:55:12.490
and it doesn't run yet until I build.
00:55:12.490 --> 00:55:14.875
So this is a slight
experience glitch right now.
00:55:14.875 --> 00:55:16.540
So we got something that
we look to improve.
00:55:16.540 --> 00:55:18.550
I'm just going to
"Shift+F6" to build.
00:55:18.550 --> 00:55:21.145
Then in theory, it build succeeded.
00:55:21.145 --> 00:55:23.680
Then now, you can see
my intellisense errors have
00:55:23.680 --> 00:55:26.260
gone away because
that base type now exists.
00:55:26.260 --> 00:55:27.280
If I "F12" on that,
00:55:27.280 --> 00:55:29.200
you'll see it goes into a file
00:55:29.200 --> 00:55:31.630
that very much looks like
it's been auto-generated.
00:55:31.630 --> 00:55:35.290
If I hover over the file name
up here and zoom in,
00:55:35.290 --> 00:55:37.600
you'll see that this file
actually is a C# file
00:55:37.600 --> 00:55:40.360
but they only exists
in the Obj folder,
00:55:40.360 --> 00:55:45.010
which is an ephemeral folder
in the.Net build mechanics.
00:55:45.010 --> 00:55:47.110
So if I clean, that goes away.
00:55:47.110 --> 00:55:48.940
It says, do no edit this
it was generated by
00:55:48.940 --> 00:55:51.055
a tool. Classic thing.
00:55:51.055 --> 00:55:52.720
So my code lives in
00:55:52.720 --> 00:55:55.330
this class Startup so I can edit
this to my heart's content,
00:55:55.330 --> 00:56:01.225
and it's all good as long as it
derives from the GreeterBase.
00:56:01.225 --> 00:56:04.060
This is all I have to do.
I've got my SayHello method,
00:56:04.060 --> 00:56:06.190
which is overriding the one
that we generated for me,
00:56:06.190 --> 00:56:09.445
and then I implement what it is
that I want to go ahead and do it,
00:56:09.445 --> 00:56:12.490
but this is running in ASP.NET Core.
00:56:12.490 --> 00:56:15.565
This is gRPC as ASP.NET
Core middleware.
00:56:15.565 --> 00:56:18.700
So it's using Kestrels
HTP2 Support, okay?
00:56:18.700 --> 00:56:22.120
>> Where's our code? Forgive
me, I'm turned around.
00:56:22.120 --> 00:56:22.665
>> No, that's fine.
00:56:22.665 --> 00:56:26.185
>> We wrote the better wrapper
and it's in 3.0 now,
00:56:26.185 --> 00:56:28.480
or it's in NuGet, or
it's coded in ASP.Net?
00:56:28.480 --> 00:56:30.550
>>So this is releasing
as part of 3.0 and it
00:56:30.550 --> 00:56:32.770
will be in a package though.
00:56:32.770 --> 00:56:34.930
It won't be in the 3.0 shared
00:56:34.930 --> 00:56:37.615
framework but the template
will be in the 3.0 SDK.
00:56:37.615 --> 00:56:39.910
So this is going to be
a supported offering.
00:56:39.910 --> 00:56:41.545
Well I use.NET Core 3.0.
00:56:41.545 --> 00:56:44.380
Great. There is a gRPC offering
in.NET Core 3.0.
00:56:44.380 --> 00:56:46.330
It is composed of code that
00:56:46.330 --> 00:56:49.075
was BOTH written by
Google and by Microsoft.
00:56:49.075 --> 00:56:50.770
The way it's implemented here,
00:56:50.770 --> 00:56:53.020
rather than it being a console app,
00:56:53.020 --> 00:56:54.430
the boots or server that is
00:56:54.430 --> 00:56:55.900
a thin managed veneer over
00:56:55.900 --> 00:56:58.435
our native server that
Google wrote in C,
00:56:58.435 --> 00:57:01.825
it's booting Kestrel, it's
booting ASP.NET Core,
00:57:01.825 --> 00:57:03.640
which has a middleware to find.
00:57:03.640 --> 00:57:05.590
>> It's doing the right things
that we would expect Core-
00:57:05.590 --> 00:57:07.105
>> It's gRPC and ASP.NET Core.
00:57:07.105 --> 00:57:09.205
Now, the other solution still exists,
00:57:09.205 --> 00:57:11.665
and Google will still make available,
00:57:11.665 --> 00:57:14.440
their PR.NET gRPC mapping that
00:57:14.440 --> 00:57:17.335
doesn't use Kestrel and doesn't
use ASP.NET Core and doesn't-
00:57:17.335 --> 00:57:18.820
>> Do we call them and give them a
00:57:18.820 --> 00:57:20.215
heads up and then like,
"Yeah, cool. Good job."
00:57:20.215 --> 00:57:21.895
>> We're working with
them. So they meet
00:57:21.895 --> 00:57:24.365
regularly like more than once a week.
00:57:24.365 --> 00:57:26.975
So this is very much,
00:57:26.975 --> 00:57:29.095
they're like more love, the better.
00:57:29.095 --> 00:57:30.595
They have implementations for like
00:57:30.595 --> 00:57:32.620
everything on the planet.
So like right, great.
00:57:32.620 --> 00:57:35.260
We'll build an ASP.NET Core
implementation and we'll give it to
00:57:35.260 --> 00:57:39.385
you and we will ship it in.NET
Core 3 as a pre-canned template.
00:57:39.385 --> 00:57:42.415
>> For people that aren't
using gRPC right now,
00:57:42.415 --> 00:57:44.815
what's my most likely use case?
00:57:44.815 --> 00:57:49.060
Is that there are already a bunch
of back-end or new services?
00:57:49.060 --> 00:57:52.510
>> Yeah. So the typical use case
as I understand is
00:57:52.510 --> 00:57:56.770
for when you are doing,
process-to-process communication.
00:57:56.770 --> 00:57:59.515
So IPC like Inter-Process
Communication,
00:57:59.515 --> 00:58:02.590
or distributed communication
between machines,
00:58:02.590 --> 00:58:04.555
or between processes
running on either machines,
00:58:04.555 --> 00:58:07.090
and you want a strongly
typed contract
00:58:07.090 --> 00:58:09.895
based RPC style of implication.
00:58:09.895 --> 00:58:11.695
So you could do that obviously
00:58:11.695 --> 00:58:13.585
but not have any of the
things I said at the end.
00:58:13.585 --> 00:58:16.255
You could just do HTP
plus JSON and do restful,
00:58:16.255 --> 00:58:18.295
but that's not contract-based,
00:58:18.295 --> 00:58:19.900
or you could do Graphql,
00:58:19.900 --> 00:58:21.910
but then you'd use
a separate tool chain
00:58:21.910 --> 00:58:23.875
to figure out how to generate
the client, duh, duh, duh.
00:58:23.875 --> 00:58:25.795
gRPC gives you an end-to-end.
00:58:25.795 --> 00:58:29.710
So it's like I start with
the protofile, which is here.
00:58:29.710 --> 00:58:31.750
So if I get back, this
is what you start with,
00:58:31.750 --> 00:58:33.040
you define the messages
00:58:33.040 --> 00:58:35.410
and we don't have
TextMate coloring, it's coming.
00:58:35.410 --> 00:58:38.170
So in an update of Visual Studio
before we shipped,
00:58:38.170 --> 00:58:40.600
you'll get colorization
for this, etc.
00:58:40.600 --> 00:58:41.860
But you define that I will have
00:58:41.860 --> 00:58:43.840
a service called a Greeter and it is
00:58:43.840 --> 00:58:46.000
an RPC call that has
a SayHello method that
00:58:46.000 --> 00:58:48.445
takes a hello requests and
returns a hello reply.
00:58:48.445 --> 00:58:52.190
Then I've defined Hello requests
and Hello reply down here.
00:58:52.230 --> 00:58:56.695
Then the tool chain takes
this protofile and generates
00:58:56.695 --> 00:59:00.310
a server and a client in the
language that I asked it to do so.
00:59:00.310 --> 00:59:02.875
In this case, it's generating
me a server in C#,
00:59:02.875 --> 00:59:04.720
implement on top of ASP.NET Core,
00:59:04.720 --> 00:59:06.490
and a client over here,
00:59:06.490 --> 00:59:09.160
which is very similar to what you
showed John in that blog post,
00:59:09.160 --> 00:59:12.160
which is a.NET Core
console application that
00:59:12.160 --> 00:59:16.030
manually invokes
the generated client classes.
00:59:16.030 --> 00:59:22.720
>> I feel as someone who started
in DCOM and before that RMI.
00:59:22.720 --> 00:59:23.020
>> Yes.
00:59:23.020 --> 00:59:26.665
>> Can't remember if it's
Java's remote method implications.
00:59:26.665 --> 00:59:27.925
>> [inaudible] all the others things.
00:59:27.925 --> 00:59:30.475
>> I have mixed feelings about this
but it's pretty cool actually.
00:59:30.475 --> 00:59:31.525
>> Yeah, and that's why I have scan.
00:59:31.525 --> 00:59:35.515
Reality is this is again a part
of us meeting customers.
00:59:35.515 --> 00:59:37.675
>> Sometimes, you got to do
a remote procedure call.
00:59:37.675 --> 00:59:38.710
>> That's exactly right.
00:59:38.710 --> 00:59:41.590
>> Sorry. My webcam is
having a [inaudible]
00:59:41.590 --> 00:59:42.970
>> Yeah, it's a little glitchy.
00:59:42.970 --> 00:59:46.135
>> I don't know what's going on.
Plug it in, unplug it again.
00:59:46.135 --> 00:59:48.100
>> Are there any comments or
because I'm showing you I
00:59:48.100 --> 00:59:50.230
can't see if there are
any other comments that people want.
00:59:50.230 --> 00:59:52.465
Has anyone asking
questions about this?
00:59:52.465 --> 00:59:54.910
>> gRPC integration is great work.
00:59:54.910 --> 00:59:56.800
We like it because it
helps us do our job,
00:59:56.800 --> 00:59:59.015
it's not glamorous like
a Web Server Platform,
00:59:59.015 --> 01:00:01.710
background services for the WIN,
01:00:01.710 --> 01:00:04.965
both of the people who are
still listening love it.
01:00:04.965 --> 01:00:07.335
>> Nice. Very good.
01:00:07.335 --> 01:00:08.970
>> They're so quiet. I think
01:00:08.970 --> 01:00:10.350
that let me just give
you a little bit of-
01:00:10.350 --> 01:00:10.690
>> [inaudible] .
01:00:10.690 --> 01:00:14.405
>> My friends who are
on the comments here.
01:00:14.405 --> 01:00:16.780
We can have a million views and
01:00:16.780 --> 01:00:18.640
we would all go, "Good
job, a million views."
01:00:18.640 --> 01:00:20.515
But if we had
a hundred good comments,
01:00:20.515 --> 01:00:22.015
we'll even like that even more.
01:00:22.015 --> 01:00:24.910
We want inner engagement.
We want to talk to humans.
01:00:24.910 --> 01:00:28.450
So anyone who wants to put
a comment, just say, "Hello."
01:00:28.450 --> 01:00:30.460
We appreciate you more than
01:00:30.460 --> 01:00:32.965
the anonymous views of
01:00:32.965 --> 01:00:36.160
the other 80 people who decided
to show up and then leave,
01:00:36.160 --> 01:00:38.440
and they just left YouTube
streaming while they went home.
01:00:38.440 --> 01:00:39.055
>> That's true.
01:00:39.055 --> 01:00:41.965
>> What's nice too is people
say, "Hey, I didn't understand.
01:00:41.965 --> 01:00:44.005
Can you go back over that part," or,
01:00:44.005 --> 01:00:45.340
"Why would I want to use this?"
01:00:45.340 --> 01:00:47.815
So that stuff, it's
great interaction.
01:00:47.815 --> 01:00:49.600
>> Yeah. So I was
just going to see if
01:00:49.600 --> 01:00:51.490
there was anything else I wanted
01:00:51.490 --> 01:00:55.210
to quickly show you that is
interesting in Pro-In Preview 3.
01:00:55.210 --> 01:00:56.545
Let me just have a quick-
01:00:56.545 --> 01:00:57.850
>> Question while you're doing that.
01:00:57.850 --> 01:00:58.010
>> Yeah.
01:00:58.010 --> 01:01:02.335
>> So this is similar to
like the WebJobs feel too?
01:01:02.335 --> 01:01:04.495
>> Yeah, it's funny you say that.
01:01:04.495 --> 01:01:07.120
So for the worker, you
mean specifically?
01:01:07.120 --> 01:01:07.330
>> Yeah.
01:01:07.330 --> 01:01:08.590
>> Yeah. So the worker template.
01:01:08.590 --> 01:01:09.190
>> Sorry that's going back?
01:01:09.190 --> 01:01:11.830
>> Yeah, going back.
So the work a template in
01:01:11.830 --> 01:01:15.505
its first prototype use
the WebJobs SDK.
01:01:15.505 --> 01:01:17.860
So we toyed around with
01:01:17.860 --> 01:01:20.935
the idea of actually
embracing the WebJobs SDK,
01:01:20.935 --> 01:01:23.275
and using that as like
01:01:23.275 --> 01:01:26.095
the working model and
improving it and stuff.
01:01:26.095 --> 01:01:27.910
We haven't done that yet.
01:01:27.910 --> 01:01:30.100
So we went there and we
pulled out a little bit when
01:01:30.100 --> 01:01:32.320
we spoke to that team,
01:01:32.320 --> 01:01:34.060
and we looked at it,
and we decided, well,
01:01:34.060 --> 01:01:37.210
maybe it's too much to give
all that straight off the bat.
01:01:37.210 --> 01:01:41.245
Also, it has an unfortunate unknown
Cloud agnostic name.
01:01:41.245 --> 01:01:42.850
It's called Azure WebJobs,
01:01:42.850 --> 01:01:44.830
where it's nothing Azure
about the SDK at all,
01:01:44.830 --> 01:01:46.435
the SDK will run anywhere.
01:01:46.435 --> 01:01:49.525
So it was just a bit of
a mismatch and so we said,
01:01:49.525 --> 01:01:51.940
"Let's start with
a basic worker template that
01:01:51.940 --> 01:01:55.450
describes that lets you start
with this type of workload."
01:01:55.450 --> 01:01:57.850
It's a console application
that uses our hosting model
01:01:57.850 --> 01:02:00.400
with configuration BI extensions etc,
01:02:00.400 --> 01:02:01.675
our background hosting thing.
01:02:01.675 --> 01:02:04.345
Then we can explore
adding more stuff.
01:02:04.345 --> 01:02:07.540
The eventual long-term goal,
I'll let you know a secret.
01:02:07.540 --> 01:02:10.135
The eventual goal is that
01:02:10.135 --> 01:02:13.090
you'll start with a worker service
and then you're like, "Okay.
01:02:13.090 --> 01:02:16.960
I want this worker service to do
is run some code when this file
01:02:16.960 --> 01:02:18.160
changes on my on
01:02:18.160 --> 01:02:19.630
my Azure blob storage via
01:02:19.630 --> 01:02:21.745
Event Grid." That's
what I want it to do.
01:02:21.745 --> 01:02:24.610
So, but you need a gesture
for that second part.
01:02:24.610 --> 01:02:25.840
Creating the empty template with
01:02:25.840 --> 01:02:27.835
the infrastructure I showed
you is pretty straightforward.
01:02:27.835 --> 01:02:30.670
Adding the Azure-specific stuff with
01:02:30.670 --> 01:02:32.230
all the Config and pointing to
01:02:32.230 --> 01:02:34.810
your subscription and like what file
are you monitoring and blah,
01:02:34.810 --> 01:02:36.790
blah, blah, and
what package you have to
01:02:36.790 --> 01:02:39.175
add because you need to know
the right one with the SDK in it.
01:02:39.175 --> 01:02:43.105
That part is the bit that
is complicated today.
01:02:43.105 --> 01:02:44.590
You have to go and
read a bunch docs and
01:02:44.590 --> 01:02:46.000
then you're not really sure
if you read the right doc,
01:02:46.000 --> 01:02:48.820
and then is the code up-to-date
on it, it's a new version of SDK.
01:02:48.820 --> 01:02:51.520
Don't do that do this
instead. What we would love
01:02:51.520 --> 01:02:54.700
is that you do what I did and
then you just have a button,
01:02:54.700 --> 01:02:56.425
like a scaffolding type thing.
01:02:56.425 --> 01:02:58.270
Like imagine you write
and ask him, and he say,
01:02:58.270 --> 01:03:02.125
"Add Azure Storage Events Handler."
01:03:02.125 --> 01:03:04.630
Then it just does the stuff in
01:03:04.630 --> 01:03:07.855
your project that's required
to get that to work.
01:03:07.855 --> 01:03:11.110
So we have this working name for
that like smart scaffolding.
01:03:11.110 --> 01:03:14.725
We want this to be a thing
beyond 3.0. This one is on 3.0.
01:03:14.725 --> 01:03:16.765
This is a thing that we're
thinking longer term,
01:03:16.765 --> 01:03:18.700
and this is how we would
01:03:18.700 --> 01:03:21.070
evolve this type of
application development.
01:03:21.070 --> 01:03:22.540
So the rather than you having to go
01:03:22.540 --> 01:03:24.580
and do a bunch of
documentation reading,
01:03:24.580 --> 01:03:26.379
just to get the most
basic HelloWorld,
01:03:26.379 --> 01:03:29.320
sort of Cloud distributed
computing-based thing to work.
01:03:29.320 --> 01:03:31.840
The tooling would help you get and
it would just be VS. Obviously,
01:03:31.840 --> 01:03:34.300
there'll be a command line
experience for this as well.
01:03:34.300 --> 01:03:36.490
So that's something
we're extremely early
01:03:36.490 --> 01:03:39.295
thinking about the things that
we're building in 3.0 now,
01:03:39.295 --> 01:03:41.650
our building blocks towards
01:03:41.650 --> 01:03:44.620
us adding this type of
functionality in the future.
01:03:44.620 --> 01:03:46.615
>> Yeah.
01:03:46.615 --> 01:03:50.170
>> So that's all I have time to
show really. It's for an hour in.
01:03:50.170 --> 01:03:51.700
Does anyone have any
questions online that
01:03:51.700 --> 01:03:54.260
they want me to answer
in the next few minutes?
01:03:54.900 --> 01:03:57.010
I guess I could just go and look now
01:03:57.010 --> 01:03:58.780
because I'm actually presenting.
01:03:58.780 --> 01:04:00.865
>> Yeah, I don't see
any. We had some-
01:04:00.865 --> 01:04:02.920
>> I saw something about
Blazor and Razor components,
01:04:02.920 --> 01:04:04.945
was there someone asking
something about that?
01:04:04.945 --> 01:04:06.820
>> That was about the workshop in
01:04:06.820 --> 01:04:09.265
London and there are saying, I think.
01:04:09.265 --> 01:04:13.090
>> Okay. That might have been
a question very early. Here we go.
01:04:13.090 --> 01:04:17.690
What is the heck for renaming
Blazor to Components?
01:04:20.130 --> 01:04:26.320
So Blazor was the name that
Steve coined when he built the-
01:04:26.320 --> 01:04:27.520
>> I've got to go. I'm rebooting.
01:04:27.520 --> 01:04:28.885
>> Okay Ray. No problem.
01:04:28.885 --> 01:04:31.330
>> Blazor was the name
that Steve coined when
01:04:31.330 --> 01:04:35.315
he created the initial prototype
like two and half years ago,
01:04:35.315 --> 01:04:39.725
which melded a WebAssembly.Net
run-time that he found on GitHub.
01:04:39.725 --> 01:04:43.175
Sorry, it was a C.Net
run-time that he ran through
01:04:43.175 --> 01:04:46.320
the WebAssembly compile chain
to build a WebAssembly.
01:04:46.320 --> 01:04:48.605
NET run-time, and then he built
a spot framework on top of it.
01:04:48.605 --> 01:04:50.855
He was all like browser and Razor,
01:04:50.855 --> 01:04:53.995
a let's call it a Blazor. It's
cool and the kind of stuck.
01:04:53.995 --> 01:04:55.740
But when it came to saying, well,
01:04:55.740 --> 01:04:58.040
what are the steps to
01:04:58.040 --> 01:05:01.445
shipping that product rather than
just let's just ship Blazor,
01:05:01.445 --> 01:05:03.030
like we can't just ship
Blazor a like that,
01:05:03.030 --> 01:05:04.950
like it's building a.NET run-time
01:05:04.950 --> 01:05:07.325
that runs in WebAssembly
is a lot of work.
01:05:07.325 --> 01:05:10.510
But there's a lot of value
in the component model,
01:05:10.510 --> 01:05:14.325
in the programming model,
that Blazor brings.
01:05:14.325 --> 01:05:17.170
So, we said why don't we
ship that? Why can't we?
01:05:17.170 --> 01:05:19.260
It's already been architect-ed
and built the way
01:05:19.260 --> 01:05:21.640
that Steve did it
and the team did it,
01:05:21.640 --> 01:05:22.960
so that those things are separate.
01:05:22.960 --> 01:05:26.780
You can run the Razor
components engine anyway, right?
01:05:26.780 --> 01:05:29.080
We've seen examples where
they run it in electron,
01:05:29.080 --> 01:05:30.130
with.NET Core instead of
01:05:30.130 --> 01:05:32.250
WebAssembly and because
everything's remoted.
01:05:32.250 --> 01:05:34.665
So, we said why don't we just support
01:05:34.665 --> 01:05:38.620
the server side Blazor as
it's called, in.NET Core 3,
01:05:38.620 --> 01:05:41.430
and then when the WebAssembly stuff
comes online later on,
01:05:41.430 --> 01:05:43.445
then we can ship that with a vary
01:05:43.445 --> 01:05:44.440
and people will only have to make
01:05:44.440 --> 01:05:45.595
very small changes to their apps.
01:05:45.595 --> 01:05:46.925
If they want to run
them in the client
01:05:46.925 --> 01:05:48.310
because sometimes you don't want it.
01:05:48.310 --> 01:05:51.490
So, then separate to that Ryan and I,
01:05:51.490 --> 01:05:53.985
Ryan is the architect
in MVC in Razor.
01:05:53.985 --> 01:05:57.090
We'd always wanted, shortly
after we did tech help us,
01:05:57.090 --> 01:05:59.259
we'd always wanted to move
01:05:59.259 --> 01:06:02.340
Razor to a more component
focused system.
01:06:02.340 --> 01:06:04.390
We have view components
in MVC, in ASP.
01:06:04.390 --> 01:06:07.160
NET Core but frankly
they're not great.
01:06:07.160 --> 01:06:10.050
We don't generally recommend
people use them and,
01:06:10.050 --> 01:06:11.440
moving forward, we
would very much tell
01:06:11.440 --> 01:06:13.050
people to use Razor
components instead.
01:06:13.050 --> 01:06:14.470
What we wanted was
01:06:14.470 --> 01:06:16.380
the experience you get,
the authoring experience,
01:06:16.380 --> 01:06:18.450
you get cHTML coupled with
01:06:18.450 --> 01:06:22.930
a strong type and build system
that you get with C sharp, right.
01:06:22.930 --> 01:06:24.680
Today, in Razor you don't get that,
01:06:24.680 --> 01:06:27.180
with tech helpers aren't
referred to as a type.
01:06:27.180 --> 01:06:28.720
They're referred to with
the directive where
01:06:28.720 --> 01:06:30.845
you have a string that
gets parsed and stuff.
01:06:30.845 --> 01:06:34.140
Razor, it does
a good job of melding C
01:06:34.140 --> 01:06:37.210
sharp and an HTML
together in one file.
01:06:37.210 --> 01:06:39.485
But when you traverse
multiple files like
01:06:39.485 --> 01:06:41.130
a view imports and view starts
01:06:41.130 --> 01:06:42.970
and layout files and
things like that,
01:06:42.970 --> 01:06:45.455
the contract between those
isn't strongly typed.
01:06:45.455 --> 01:06:48.980
Like you pass data between
the page and a layout in a bag.
01:06:48.980 --> 01:06:51.720
You'd say here's the view context of
01:06:51.720 --> 01:06:54.590
items and you throw some data
in with a string, right?
01:06:54.590 --> 01:06:56.610
And then you pull it out
again the other side.
01:06:56.610 --> 01:06:58.800
It's been like that forever.
01:06:58.800 --> 01:07:00.695
It's been like that for
ten years. But we've
01:07:00.695 --> 01:07:01.880
always wanted to do more.
01:07:01.880 --> 01:07:04.320
And we said a components system where
01:07:04.320 --> 01:07:08.220
Razor was a little bit more like
new XAML produces types, right?
01:07:08.220 --> 01:07:09.695
You compile it and you get types out
01:07:09.695 --> 01:07:11.640
the other side and types
can refer to types.
01:07:11.640 --> 01:07:13.240
That's how Razor components works.
01:07:13.240 --> 01:07:14.490
That's how Blazor works.
01:07:14.490 --> 01:07:18.040
And so we took that and we
shoved it into.NET Core
01:07:18.040 --> 01:07:21.750
3 and supported it running on
ASP.NET Core on the server side.
01:07:21.750 --> 01:07:23.105
And then we said well great.
01:07:23.105 --> 01:07:25.730
How do you integrate Razor views
and pages with Razor components?
01:07:25.730 --> 01:07:26.855
We have a model for that as well.
01:07:26.855 --> 01:07:30.960
So Razor views slash pages
can host Razor components.
01:07:30.960 --> 01:07:32.640
So you can have a Razor component as
01:07:32.640 --> 01:07:34.540
a self-contained units
like a component.
01:07:34.540 --> 01:07:35.680
That's what the term means, right?
01:07:35.680 --> 01:07:37.070
A component of UI.
01:07:37.070 --> 01:07:39.090
And you can just shove that inside
01:07:39.090 --> 01:07:41.985
a Razor view or a Razor
page or a Razor layout.
01:07:41.985 --> 01:07:43.860
We're also looking at
doing the work to have
01:07:43.860 --> 01:07:46.420
a Razor components page share
01:07:46.420 --> 01:07:49.240
a layout with a standard Razor view
or a standard Razor page,
01:07:49.240 --> 01:07:51.050
so that you can still use
all these things together.
01:07:51.050 --> 01:07:52.860
So you can have migrate over
01:07:52.860 --> 01:07:55.360
time or just have
parts of your apps use
01:07:55.360 --> 01:07:57.680
Razor components because it's
a better programming model for that
01:07:57.680 --> 01:07:59.290
but stick with Razor pages
01:07:59.290 --> 01:08:00.610
because you want to do
a request response.
01:08:00.610 --> 01:08:02.190
Because Razor components
is a real-time
01:08:02.190 --> 01:08:03.845
stateful based system whereas
01:08:03.845 --> 01:08:05.970
Razor views and Razor
pages are based on
01:08:05.970 --> 01:08:08.160
a request response
style system, right?
01:08:08.160 --> 01:08:10.040
You have a model, its bound incoming.
01:08:10.040 --> 01:08:12.150
You have an outgoing model
as model validation and
01:08:12.150 --> 01:08:13.230
model validation errors and
01:08:13.230 --> 01:08:15.880
[inaudible] and you get
a request contexts and [inaudible].
01:08:15.880 --> 01:08:17.070
You don't get any of that
in Razor components.
01:08:17.070 --> 01:08:19.190
Razor components assumes
you have a connection,
01:08:19.190 --> 01:08:21.500
a circuit, a components
circuit as it's called.
01:08:21.500 --> 01:08:24.365
Everything's just stateful.
You handle events, right?
01:08:24.365 --> 01:08:26.710
It doesn't know about requests
and responses and stuff.
01:08:26.710 --> 01:08:27.725
It's designed to be
01:08:27.725 --> 01:08:32.385
a stateful UI system because
you want it to run in a client.
01:08:32.385 --> 01:08:35.045
That's the whole point or if
you're not running in the client,
01:08:35.045 --> 01:08:37.170
you want it to appear like
it's running in the client
01:08:37.170 --> 01:08:40.180
over whatever connection mechanism
you're using between
01:08:40.180 --> 01:08:41.375
where the rendering
engine is and where
01:08:41.375 --> 01:08:42.880
the actual rendering occurs and we're
01:08:42.880 --> 01:08:45.890
using signal for that in.NET Core 3.
01:08:45.890 --> 01:08:46.930
So, yeah, that's the story.
01:08:46.930 --> 01:08:48.150
That's what we said when
it comes to doing that.
01:08:48.150 --> 01:08:50.025
We don't want to call that
Blazor because Blazor
01:08:50.025 --> 01:08:52.475
as a name in our mind refers
01:08:52.475 --> 01:08:57.650
to Razor component at model running
in the browser on WebAssembly.
01:08:57.650 --> 01:09:01.100
Whereas Razor components are
the components that you build.
01:09:01.100 --> 01:09:02.650
You create adult Razor file which is
01:09:02.650 --> 01:09:04.235
coming in preview three by the way.
01:09:04.235 --> 01:09:09.070
Create adult Razor file that gets
compiled into a type which is
01:09:09.070 --> 01:09:10.860
a Razor components type
and then you can
01:09:10.860 --> 01:09:12.790
host that either in
a server side application
01:09:12.790 --> 01:09:14.170
in.NET Core 3 or in
01:09:14.170 --> 01:09:16.545
a Blazor application in the client
running on WebAssembly.
01:09:16.545 --> 01:09:18.005
So that's where
the name difference comes
01:09:18.005 --> 01:09:20.175
from. That was a long answer.
01:09:20.175 --> 01:09:23.130
>> Yeah. We do have
a few more questions.
01:09:23.130 --> 01:09:23.460
>> Yeah.
01:09:23.460 --> 01:09:24.030
>> If you want to jump in.
01:09:24.030 --> 01:09:25.750
>> I can quickly give
some answers here.
01:09:25.750 --> 01:09:27.450
Are we going to see any any
feature templates around
01:09:27.450 --> 01:09:29.555
hosting VueJS since it's
popularity is increasing?
01:09:29.555 --> 01:09:31.745
For the most part,
Notes services is cutting it.
01:09:31.745 --> 01:09:33.835
No. We don't have
any plans right now to
01:09:33.835 --> 01:09:35.650
add anything to the SPA stuff.
01:09:35.650 --> 01:09:39.440
We intend to remove or
we did tend to remove
01:09:39.440 --> 01:09:41.605
the SPA Templates
from the SDK because
01:09:41.605 --> 01:09:42.650
we were finding that
they were just getting
01:09:42.650 --> 01:09:43.895
out of date too quickly.
01:09:43.895 --> 01:09:48.640
Because the ship cycles and
the servicing bar for.NET core
01:09:48.640 --> 01:09:51.310
just wasn't a good match
for the ship cycles of
01:09:51.310 --> 01:09:54.225
the SPA frameworks and nodes.
01:09:54.225 --> 01:09:57.030
So we would find like we'd get
two versions of angular behind
01:09:57.030 --> 01:09:58.060
before we had a release
01:09:58.060 --> 01:09:59.990
of.NET Core where we could
update this templates.
01:09:59.990 --> 01:10:00.965
But I think we're going to do
01:10:00.965 --> 01:10:02.280
a feature in three
that's going to let
01:10:02.280 --> 01:10:05.125
us rev those templates at a band.
01:10:05.125 --> 01:10:06.400
So you'll still be able to have like
01:10:06.400 --> 01:10:08.100
an Angular template in the box but
01:10:08.100 --> 01:10:09.460
we'll be able to update it and
01:10:09.460 --> 01:10:10.980
it'll tell you in
this new version of stuff.
01:10:10.980 --> 01:10:12.570
So we're hoping that
it's going to land.
01:10:12.570 --> 01:10:14.660
But as for Vue,
01:10:14.660 --> 01:10:18.315
I haven't seen any data
yet or any suggestion that
01:10:18.315 --> 01:10:20.170
warrants us to think
that we should go
01:10:20.170 --> 01:10:22.125
and spend the time
to add up Vue there.
01:10:22.125 --> 01:10:24.755
But honestly my honest opinion
on this is that that seems
01:10:24.755 --> 01:10:26.050
like something that was a great thing
01:10:26.050 --> 01:10:27.305
for the community to get behind.
01:10:27.305 --> 01:10:30.230
If there is a strong set
01:10:30.230 --> 01:10:32.045
of community members who love using
01:10:32.045 --> 01:10:34.145
Vue with the Node
Services and the ASP.
01:10:34.145 --> 01:10:35.460
NET Core stuff that we have,
01:10:35.460 --> 01:10:38.850
then I'd encourage them and
we will promote them up
01:10:38.850 --> 01:10:42.270
the wazoo to put together
a great template
01:10:42.270 --> 01:10:45.850
and a V6 extension that you can
install and have those templates
01:10:45.850 --> 01:10:47.140
show up in the right
place and then you've got
01:10:47.140 --> 01:10:49.970
a great Vue template that's
maintained by the people who use it.
01:10:49.970 --> 01:10:54.880
We did Angular, React and Redux
because they were very clearly
01:10:54.880 --> 01:10:56.990
the most popular ones
and customers were
01:10:56.990 --> 01:10:58.600
asking for them and they were
01:10:58.600 --> 01:11:00.655
the logical ones to do when
we built the features.
01:11:00.655 --> 01:11:04.090
Most of that time is spent building
the stuff in three R right
01:11:04.090 --> 01:11:07.985
now and templates are quite
expensive to maintain to do well.
01:11:07.985 --> 01:11:09.400
Especially for the ones
that we have to put in
01:11:09.400 --> 01:11:11.110
the box and go as far
01:11:11.110 --> 01:11:15.070
as the community projects that
are maintaining templates.
01:11:15.070 --> 01:11:17.270
They don't have to quite
go to the same length
01:11:17.270 --> 01:11:19.085
and the amount of work that we have
01:11:19.085 --> 01:11:20.555
to go to when we include a template.
01:11:20.555 --> 01:11:22.595
Like we have to put them through
accessibility checking and
01:11:22.595 --> 01:11:25.805
localization and security checking
and that always happens.
01:11:25.805 --> 01:11:27.930
Yeah, it's good practice
to do all these things.
01:11:27.930 --> 01:11:29.530
But we have to do
these things and they're very
01:11:29.530 --> 01:11:31.330
expensive and so keeping
01:11:31.330 --> 01:11:32.835
them up to date and
01:11:32.835 --> 01:11:35.200
signing enough people do
that work, it can be difficult.
01:11:35.200 --> 01:11:37.120
Whereas perhaps a community project
01:11:37.120 --> 01:11:39.515
can get away with doing
little less work on them.
01:11:39.515 --> 01:11:42.370
>> Because it's
relatively easy to create
01:11:42.370 --> 01:11:45.730
a project template or
item template now.
01:11:45.730 --> 01:11:49.020
It's like that is a nice thing
where community actually can do it.
01:11:49.020 --> 01:11:50.800
Whereas in the past
creating project template
01:11:50.800 --> 01:11:52.415
was forget it was so hard, right?
01:11:52.415 --> 01:11:53.005
>> Yeah.
01:11:53.005 --> 01:11:54.935
>> But now it's like
really lightweight.
01:11:54.935 --> 01:11:56.860
>> So Ian Clerk asks are you seeing
01:11:56.860 --> 01:11:58.540
any emerging common stack patents
01:11:58.540 --> 01:12:00.160
for customers using.NET
in production?
01:12:00.160 --> 01:12:03.020
For example, Razor pages
or MVC plus SQL Server,
01:12:03.020 --> 01:12:06.800
React Angular other SPA plus
[inaudible] SQL Server etc., etc.
01:12:06.800 --> 01:12:09.945
Yes and no. The reality
is we see everything.
01:12:09.945 --> 01:12:13.490
We see everything. I wouldn't
even attempt to try and
01:12:13.490 --> 01:12:15.550
say that there's a lovely acronym
01:12:15.550 --> 01:12:17.710
that turns into a word
that we can say,
01:12:17.710 --> 01:12:20.290
oh yeah, we see
the FANT stack or something.
01:12:20.290 --> 01:12:21.570
They're all over the place, right?
01:12:21.570 --> 01:12:25.385
F sharp plus Apache plus.Net
plus tensor. I don't know.
01:12:25.385 --> 01:12:29.960
I just made that up. No. We see
customers doing everything.
01:12:29.960 --> 01:12:34.560
The reality is that once
01:12:34.560 --> 01:12:36.810
you have an application
that's been in use for
01:12:36.810 --> 01:12:40.060
a while or you're in
place that's had gone
01:12:40.060 --> 01:12:43.885
through a series of cycles of
application development thinking,
01:12:43.885 --> 01:12:47.160
you often end up with
all different types of technologies.
01:12:47.160 --> 01:12:49.370
Yeah and I came from
that world like ten years ago.
01:12:49.370 --> 01:12:51.365
That's what I did for a long time.
01:12:51.365 --> 01:12:53.015
It was not unusual to have
01:12:53.015 --> 01:12:56.470
extremely heterogeneous
environments where
01:12:56.470 --> 01:12:59.330
you had.NET talking to Oracle with
01:12:59.330 --> 01:13:02.860
some other enterprise service
bus products coupled with
01:13:02.860 --> 01:13:04.990
some hardware device with an SDK
01:13:04.990 --> 01:13:07.720
coupled with [inaudible]
before even before the Cloud.
01:13:07.720 --> 01:13:09.975
Now you've got
the Cloud. Then you add
01:13:09.975 --> 01:13:11.255
the multiple Cloud providers to
01:13:11.255 --> 01:13:13.540
those things and
multiple SPA frameworks.
01:13:13.540 --> 01:13:15.990
Some customers like homogeny
01:13:15.990 --> 01:13:17.645
a little more and so
some customers will
01:13:17.645 --> 01:13:22.285
be a little more prescriptive and
they will ask for prescription.
01:13:22.285 --> 01:13:24.690
We try to codify our prescription
as the little that
01:13:24.690 --> 01:13:27.040
we give typically in the templates,
01:13:27.040 --> 01:13:28.530
the experiences and
the documentation that we
01:13:28.530 --> 01:13:30.370
give and then beyond that it's really
01:13:30.370 --> 01:13:32.610
an exercise for the customer to
01:13:32.610 --> 01:13:35.415
decide what is best for
them and their needs.
01:13:35.415 --> 01:13:37.940
And yeah, but we see
people use all of these.
01:13:37.940 --> 01:13:40.000
All the above and
then a whole bunch of other things
01:13:40.000 --> 01:13:42.700
that I couldn't even hope
to try and remember.
01:13:42.700 --> 01:13:45.030
So I'm sorry there isn't
a cleaner answer to that.
01:13:45.030 --> 01:13:46.735
I mean generally I
would say start with
01:13:46.735 --> 01:13:49.000
what you see in the templates
and what you are see in the docs
01:13:49.000 --> 01:13:52.295
and then branch out from there
especially into the community
01:13:52.295 --> 01:13:53.560
and what you see in
shows like this where we
01:13:53.560 --> 01:13:56.225
highlight fantastic
community efforts.
01:13:56.225 --> 01:13:58.360
I would encourage
folks that if they do
01:13:58.360 --> 01:14:01.000
adopt community
libraries to really do
01:14:01.000 --> 01:14:03.120
that with the attitude of
01:14:03.120 --> 01:14:05.255
I'm not a customer of
this community project,
01:14:05.255 --> 01:14:07.130
I'm a participant in
this community project.
01:14:07.130 --> 01:14:08.900
That if I'm going to use this code,
01:14:08.900 --> 01:14:12.180
there is an onus on
me to participate in
01:14:12.180 --> 01:14:13.540
improving this code and not
01:14:13.540 --> 01:14:15.510
log issues and say why
haven't you fixed this yet.
01:14:15.510 --> 01:14:17.310
So some person like
01:14:17.310 --> 01:14:19.465
sitting by in the table.
They're not some company.
01:14:19.465 --> 01:14:21.895
You didn't pay them any money.
That's what community
01:14:21.895 --> 01:14:24.375
projects and open source
is all about. So yeah.
01:14:24.375 --> 01:14:26.595
So I'll get off my soapbox.
01:14:26.595 --> 01:14:28.505
What else? Blazor Electron Sample.
01:14:28.505 --> 01:14:30.040
There is a Blazor
and electron sample.
01:14:30.040 --> 01:14:34.460
There's a PR out right now to
move that to the ASP labs repo.
01:14:34.460 --> 01:14:35.875
It exists. It's been
around for a while.
01:14:35.875 --> 01:14:37.045
There is a Blazor and Electron
01:14:37.045 --> 01:14:38.795
Sample if you go to
the ASP labs repo.
01:14:38.795 --> 01:14:41.280
I believe there's
an open PR right now if it
01:14:41.280 --> 01:14:44.755
has not already been merged
that has that in there.
01:14:44.755 --> 01:14:47.270
Maxima asks, are there
any updates yet?
01:14:47.270 --> 01:14:50.240
There any new server out of
the box integration for 2-2 or 3-0?
01:14:50.240 --> 01:14:53.075
The update is I saw
an e-mail yesterday
01:14:53.075 --> 01:14:56.945
where I believe Brock and Dominic,
01:14:56.945 --> 01:14:58.680
the identity server folks,
01:14:58.680 --> 01:15:02.045
have a sample of a new thing
that they're doing
01:15:02.045 --> 01:15:03.395
that they wanted to show
us and then we were
01:15:03.395 --> 01:15:05.595
going to review what
we've built with them.
01:15:05.595 --> 01:15:08.465
We had initially
planned to get previews
01:15:08.465 --> 01:15:11.010
of that out to use on top of 2-2.
01:15:11.010 --> 01:15:13.150
That might still be
the case but given
01:15:13.150 --> 01:15:15.240
where we are in
the 3-0 cycle depending
01:15:15.240 --> 01:15:17.590
on the outcome of the next round of
01:15:17.590 --> 01:15:20.370
feedback on the integration
piece that we've done,
01:15:20.370 --> 01:15:22.560
we may make the decision
to just roll that into
01:15:22.560 --> 01:15:24.950
the 3-0 timeline instead.
01:15:24.950 --> 01:15:27.895
I'll reserve judgment on that yet
because it's still in flight.
01:15:27.895 --> 01:15:29.280
But the code does exist.
01:15:29.280 --> 01:15:30.400
The templates do exist.
01:15:30.400 --> 01:15:31.740
They're just not in
a release form yet.
01:15:31.740 --> 01:15:34.085
So I've seen, for example,
01:15:34.085 --> 01:15:35.885
the new SPA templates that
01:15:35.885 --> 01:15:40.015
include the identity server
or the.token OAuth based
01:15:40.015 --> 01:15:44.440
system for Angular and for React
that will off with an ASP.NET
01:15:44.440 --> 01:15:46.440
Core server that's
hosting identity server
01:15:46.440 --> 01:15:49.310
plus the glue piece that we created.
01:15:49.310 --> 01:15:51.790
So it does exist. It
is being worked on.
01:15:51.790 --> 01:15:53.100
It had a bit of a break over
01:15:53.100 --> 01:15:55.295
the holiday period
because the developer
01:15:55.295 --> 01:15:57.640
involved moved and wasn't
01:15:57.640 --> 01:16:00.110
available for a little bit
but we're back on that now.
01:16:00.110 --> 01:16:02.100
Hopefully, we'll have
more news on that shortly.
01:16:02.100 --> 01:16:03.250
>> Sure.
01:16:05.160 --> 01:16:11.020
>> Watching live, anything new
with Progressive Web Apps, PWAs?
01:16:11.020 --> 01:16:13.810
Nothing specific. PWA is great.
01:16:13.810 --> 01:16:16.480
It comes up in the context
of Blazor quite a bit.
01:16:16.480 --> 01:16:19.360
There is opportunity
in PWA definitely,
01:16:19.360 --> 01:16:21.085
that we could do more things.
01:16:21.085 --> 01:16:23.605
We haven't had a lot of customer ask.
01:16:23.605 --> 01:16:26.410
There hasn't been a lot of
custom demand to really have us
01:16:26.410 --> 01:16:29.230
put more PWA-focused stuff
in the offering,
01:16:29.230 --> 01:16:31.630
so like APIs or
templates or anything.
01:16:31.630 --> 01:16:33.550
Most of it today, you
just build a web app,
01:16:33.550 --> 01:16:37.120
and then you go and
add some manifests
01:16:37.120 --> 01:16:38.650
and a little bit of
code and an endpoint in
01:16:38.650 --> 01:16:41.230
the server for your
service workers and stuff.
01:16:41.230 --> 01:16:43.900
I think Mads Kristensen may
have created a template at
01:16:43.900 --> 01:16:46.825
one point a couple years back
for PWAs in their earlier time.
01:16:46.825 --> 01:16:48.460
But we don't have any plans to do
01:16:48.460 --> 01:16:50.260
anything more than what's
happening right now,
01:16:50.260 --> 01:16:53.575
but when Blazor goes a little more,
01:16:53.575 --> 01:16:55.720
when we get to the point where Blazor
01:16:55.720 --> 01:16:57.280
starts having official previews,
01:16:57.280 --> 01:16:59.140
I wouldn't be surprised
if we start seeing
01:16:59.140 --> 01:17:02.290
more asks for PWAs in
the context of those,
01:17:02.290 --> 01:17:04.030
because obviously it's going to
be a different story when you've
01:17:04.030 --> 01:17:06.010
got the actual donate code
running and the client.
01:17:06.010 --> 01:17:08.140
It'll be interesting
to see what folks do.
01:17:08.140 --> 01:17:12.010
When do we get our VB.Net
ASP.NET Core support?
01:17:12.010 --> 01:17:13.765
That's a complicated question.
01:17:13.765 --> 01:17:18.295
So, there are templates that exist
today that will let you build
01:17:18.295 --> 01:17:21.895
MVC controller APIs or
01:17:21.895 --> 01:17:24.295
basic middleware stuff in VB,
and you can do it right now.
01:17:24.295 --> 01:17:25.645
It totally works.
01:17:25.645 --> 01:17:28.900
The VB support in.Net Core
to date isn't very good.
01:17:28.900 --> 01:17:30.400
It's not full VB support.
01:17:30.400 --> 01:17:32.575
That's changing in 3.0, so 3.0 is
01:17:32.575 --> 01:17:36.970
bringing more full-fledged VB
support as you would expect,
01:17:36.970 --> 01:17:38.230
like the MyNamespace and
01:17:38.230 --> 01:17:41.320
all the other VB-isms that just
don't work on.Net Core today,
01:17:41.320 --> 01:17:43.840
because we have to bring those
over to make VB WinForms in
01:17:43.840 --> 01:17:48.325
VB WPF applications possible
to port to.Net Core.
01:17:48.325 --> 01:17:50.020
What will never happen,
01:17:50.020 --> 01:17:52.765
what we have stated is we have
no intention of ever doing,
01:17:52.765 --> 01:17:55.075
is doing a VB Razor.
01:17:55.075 --> 01:17:56.890
So, Razor, when it comes to building
01:17:56.890 --> 01:17:59.665
web applications and
ASP.NET Core applications,
01:17:59.665 --> 01:18:01.945
Razor will always be C sharp.
01:18:01.945 --> 01:18:05.020
So, you will not get a
01:18:05.020 --> 01:18:08.920
VB.NET Web Application template
that has Razor that's VB.
01:18:08.920 --> 01:18:11.830
The problem with having
a template where the code
01:18:11.830 --> 01:18:14.740
is VB and the view is
a Razor is that there you've
01:18:14.740 --> 01:18:16.590
got two languages running in
01:18:16.590 --> 01:18:18.210
the same project system in
01:18:18.210 --> 01:18:20.805
OmniSharp or Visual Studio,
and that's not supported.
01:18:20.805 --> 01:18:22.110
There's no support for that today.
01:18:22.110 --> 01:18:24.360
The only project system
that supported that in
01:18:24.360 --> 01:18:27.970
Visual Studio was the old ASP
Net website project system,
01:18:27.970 --> 01:18:29.710
which actually allowed you
to have different folders
01:18:29.710 --> 01:18:33.040
with.VB files and.CS files,
and that would actually work.
01:18:33.040 --> 01:18:35.425
But that doesn't work
in the project system.
01:18:35.425 --> 01:18:38.920
So, even if you do that
today, your Razor files,
01:18:38.920 --> 01:18:40.630
it is one or the other, has to be
01:18:40.630 --> 01:18:43.255
a VB project or a C sharp project.
It can't be both.
01:18:43.255 --> 01:18:44.650
So, you have to pick
one, and then you'll get
01:18:44.650 --> 01:18:46.465
IntelliSense for that language
and that language only.
01:18:46.465 --> 01:18:49.180
So, it's not enough people
01:18:49.180 --> 01:18:50.260
who would do that to warrant
01:18:50.260 --> 01:18:51.850
the work it would take
to make that work.
01:18:51.850 --> 01:18:54.920
That's our official position
on that right now.
01:18:55.920 --> 01:18:59.290
Speaking of templates, is
there a plan to have templates
01:18:59.290 --> 01:19:02.200
based on MSAL for
Azure AD v2 endpoint?
01:19:02.200 --> 01:19:04.540
I saw an e-mail about that this week.
01:19:04.540 --> 01:19:07.210
So, I believe we are
currently discussing with
01:19:07.210 --> 01:19:11.710
that team what the best
approach is for changing
01:19:11.710 --> 01:19:17.335
MSA and AD Authentication story
01:19:17.335 --> 01:19:19.930
with regards to our templates
and libraries to be,
01:19:19.930 --> 01:19:22.000
whether it should be just
OpenID Connect-based or
01:19:22.000 --> 01:19:24.280
whether it should still be
a wrapper library of some sort that,
01:19:24.280 --> 01:19:26.110
etc and based on MSAL.
01:19:26.110 --> 01:19:27.700
So, we're looking at that right now.
01:19:27.700 --> 01:19:28.750
I don't have firm plans yet,
01:19:28.750 --> 01:19:30.940
but it's something that
we are looking at.
01:19:30.940 --> 01:19:33.730
Blazor 1.0, I don't have
any dates for Blazor 1.0.
01:19:33.730 --> 01:19:35.830
It'll be after 3.0, and we
don't know. We just don't know.
01:19:35.830 --> 01:19:38.650
Blazor 1.0 depends on
the WebAssembly story for.Net,
01:19:38.650 --> 01:19:40.780
and that's still very
much a work in progress.
01:19:40.780 --> 01:19:43.940
When we know, we will let you know.
01:19:47.280 --> 01:19:51.235
Any chance proper sample of docs
of using a client framework,
01:19:51.235 --> 01:19:53.170
Angular React with social oath,
01:19:53.170 --> 01:19:55.165
and it's been an identity?
01:19:55.165 --> 01:19:57.100
So, that's effectively what
01:19:57.100 --> 01:19:58.510
the template that's
currently being worked
01:19:58.510 --> 01:20:02.455
on for the IdentityServer integration
is going to allow you to do.
01:20:02.455 --> 01:20:04.630
Now, the IdentityServer folks
01:20:04.630 --> 01:20:07.495
have those docs; it's
my understanding.
01:20:07.495 --> 01:20:09.010
So, you should be able to go to
01:20:09.010 --> 01:20:11.905
the IdentityServer repo and do that.
01:20:11.905 --> 01:20:15.325
We don't have the support
01:20:15.325 --> 01:20:17.470
in the framework to do what
you're asking right now.
01:20:17.470 --> 01:20:19.000
That's what we're building,
because we don't have
01:20:19.000 --> 01:20:20.350
the authentication mechanisms
01:20:20.350 --> 01:20:22.015
for authenticating
spire applications.
01:20:22.015 --> 01:20:25.870
If you're using cookie off to do
your [inaudible] application,
01:20:25.870 --> 01:20:29.320
which is okay as long as you
take the right precautions,
01:20:29.320 --> 01:20:31.165
then you can do this already.
01:20:31.165 --> 01:20:34.195
But there probably isn't a good
walkthrough or sample for that.
01:20:34.195 --> 01:20:36.115
That's something that we
could potentially do.
01:20:36.115 --> 01:20:37.825
But it effectively is just,
01:20:37.825 --> 01:20:39.970
you start with
a standard application with
01:20:39.970 --> 01:20:43.090
your server-based
social authentication,
01:20:43.090 --> 01:20:45.175
so Facebook auth or
whatever it might be,
01:20:45.175 --> 01:20:48.115
and then you add the [inaudible]
application into the same one,
01:20:48.115 --> 01:20:50.275
and then you share the cookie,
01:20:50.275 --> 01:20:51.730
is basically it now.
01:20:51.730 --> 01:20:54.010
Then like what you do in
this [inaudible] application,
01:20:54.010 --> 01:20:55.750
to do authorization is where it gets,
01:20:55.750 --> 01:20:57.625
we don't have anything,
Angular doesn't have anything.
01:20:57.625 --> 01:21:00.010
That's always left as
an exercise to the reader,
01:21:00.010 --> 01:21:02.095
but in the new template
that's coming out,
01:21:02.095 --> 01:21:05.620
we actually do build a little
mini framework in the Angular App
01:21:05.620 --> 01:21:09.475
and a lot less in the React App
because it's simpler to do that.
01:21:09.475 --> 01:21:11.230
So, there's a thing that will do
01:21:11.230 --> 01:21:13.900
the outgoing auth check and then
do the redirect if it has to,
01:21:13.900 --> 01:21:15.010
and it does the right thing.
01:21:15.010 --> 01:21:17.920
So, stay tuned. There is
more than that coming.
01:21:17.920 --> 01:21:20.515
Then that old nugget,
01:21:20.515 --> 01:21:22.690
it would be good to have
a template that supports
01:21:22.690 --> 01:21:24.910
globalization best practices
out of the box.
01:21:24.910 --> 01:21:27.055
Yes, I've heard that
asked for 15 years.
01:21:27.055 --> 01:21:29.290
Again, it's one of
those things I'll refer to
01:21:29.290 --> 01:21:31.420
my previous answer where we
01:21:31.420 --> 01:21:35.845
have the localization system in
the box. There is no template.
01:21:35.845 --> 01:21:39.130
I did maintain a sample at
one point for a spinning forward.
01:21:39.130 --> 01:21:40.870
It's still there. It's
in the entropy repower,
01:21:40.870 --> 01:21:42.205
wherever it might be.
01:21:42.205 --> 01:21:44.740
I think I've said
this numerous times;
01:21:44.740 --> 01:21:46.480
that is another great
example, I think,
01:21:46.480 --> 01:21:48.535
of where a community template,
01:21:48.535 --> 01:21:49.810
a community project that
01:21:49.810 --> 01:21:53.950
maintains our templates but
fully localized versions of those,
01:21:53.950 --> 01:21:55.720
with all the changes required
to make them like clouds,
01:21:55.720 --> 01:21:58.435
would be a fantastic community
project for folks to own.
01:21:58.435 --> 01:22:00.550
It's just something we haven't been
01:22:00.550 --> 01:22:02.410
able to prioritize when it
comes down to the amount
01:22:02.410 --> 01:22:04.150
of work required to do it to
01:22:04.150 --> 01:22:07.420
the standard that we would have to
do it to include it in the box.
01:22:07.420 --> 01:22:10.030
There's no WinForms template
this localized.
01:22:10.030 --> 01:22:11.950
There's no WPF template
this localized.
01:22:11.950 --> 01:22:13.675
We're not unique in that way.
01:22:13.675 --> 01:22:16.420
>> We have seen some good
community efforts in that.
01:22:16.420 --> 01:22:16.795
>> Yes.
01:22:16.795 --> 01:22:19.075
>> Recently, I shared
something Damien Bowden did,
01:22:19.075 --> 01:22:22.730
a series, and has a GitHub repo.
01:22:22.950 --> 01:22:27.100
Identity has been localized
in their country,
01:22:27.100 --> 01:22:28.870
and they've had
pull requests like Chinese-
01:22:28.870 --> 01:22:28.990
>> That's great.
01:22:28.990 --> 01:22:30.460
>> -and all that kind of
languages and stuff, yeah.
01:22:30.460 --> 01:22:32.980
So, again, that localization
is a good area
01:22:32.980 --> 01:22:37.075
for community to jump in and do that.
01:22:37.075 --> 01:22:38.680
It seems interesting too,
01:22:38.680 --> 01:22:40.540
that's something where
people could potentially,
01:22:40.540 --> 01:22:42.190
with Razor components also,
01:22:42.190 --> 01:22:46.435
do some Razor class libraries, sorry.
01:22:46.435 --> 01:22:50.620
>> Right. So, Destination Dubs,
01:22:50.620 --> 01:22:52.150
just following up on
his question regarding
01:22:52.150 --> 01:22:54.175
the auth on social auth. Yes,
so that's what we're building.
01:22:54.175 --> 01:22:55.300
That's exactly what we're building,
01:22:55.300 --> 01:22:58.510
which is where you have
an API application
01:22:58.510 --> 01:23:00.475
that is secured using IdentityServer,
01:23:00.475 --> 01:23:01.900
and it's using job tokens,
01:23:01.900 --> 01:23:02.230
and then you have
01:23:02.230 --> 01:23:04.225
a [inaudible] application that
needs to authenticate with that.
01:23:04.225 --> 01:23:06.190
That is literally the templates
that are currently being
01:23:06.190 --> 01:23:09.865
built, so stay tuned.
01:23:09.865 --> 01:23:11.350
All right, that's it.
01:23:11.350 --> 01:23:14.755
>> We're super long
contract, many hours.
01:23:14.755 --> 01:23:16.660
>> Yeah, all the hours.
01:23:16.660 --> 01:23:18.670
There's a question over on Twitch,
01:23:18.670 --> 01:23:22.165
how usually they secure an RPC call
compared to normal Azure.
01:23:22.165 --> 01:23:25.480
So, my understanding, I ask the
security question [inaudible] answer.
01:23:25.480 --> 01:23:28.660
I asked the security
question with gRPC,
01:23:28.660 --> 01:23:30.985
and the answer I got back
was you don't do that.
01:23:30.985 --> 01:23:34.000
gRPC, typically, it's over HTTP,
01:23:34.000 --> 01:23:35.650
so you can secure it using
01:23:35.650 --> 01:23:37.825
whatever you use to
secure the HB2 channel,
01:23:37.825 --> 01:23:39.640
which could be certificate auth.
01:23:39.640 --> 01:23:41.260
You do it over HTTPS,
01:23:41.260 --> 01:23:44.035
and you do certificate
authentication, those type of things.
01:23:44.035 --> 01:23:47.050
But it's intended more for
01:23:47.050 --> 01:23:50.095
RPC-style scenarios where
both sides trust each other.
01:23:50.095 --> 01:23:51.670
I may be wrong.
01:23:51.670 --> 01:23:53.650
Maybe I've got the wrong information
or I heard it wrong.
01:23:53.650 --> 01:23:55.480
So, if people on the
stream know more,
01:23:55.480 --> 01:23:56.860
by all means correct me,
01:23:56.860 --> 01:23:58.990
but gRPC is over HTTP.
01:23:58.990 --> 01:24:02.725
It's HTTP2, but it takes
over the connection.
01:24:02.725 --> 01:24:05.560
So, the pathing of each request
is used to resolve
01:24:05.560 --> 01:24:09.800
which gRPC endpoint
or method to call.
01:24:10.530 --> 01:24:13.360
If that's true, then the
authentication would typically be
01:24:13.360 --> 01:24:15.700
done at the transport layer.
01:24:15.700 --> 01:24:18.610
So, you would use certificate auth
or something like that.
01:24:18.610 --> 01:24:19.975
That's my understanding.
01:24:19.975 --> 01:24:21.880
If anyone has a deeper
understanding of that,
01:24:21.880 --> 01:24:24.805
which I'm sure many people
do, feel free to answer that.
01:24:24.805 --> 01:24:28.360
All right, we're done.
01:24:28.360 --> 01:24:29.050
>> Great.
01:24:29.050 --> 01:24:31.600
>> I need to try and get in here
every week. Stuff comes up.
01:24:31.600 --> 01:24:31.735
>> Yeah.
01:24:31.735 --> 01:24:33.850
>> But I always enjoy coming in
01:24:33.850 --> 01:24:37.570
and answering all the questions
and showing stuff.
01:24:37.570 --> 01:24:40.090
>> Hey, maybe we can
rope David in next week.
01:24:40.090 --> 01:24:41.620
>> Yeah. Well, I'll
01:24:41.620 --> 01:24:44.185
keep reminding him and
punching him in the arm,
01:24:44.185 --> 01:24:46.000
and we'll see if I
can get him in here.
01:24:46.000 --> 01:24:47.200
Maybe I'll just send him a meeting
01:24:47.200 --> 01:24:48.310
and not tell him what it is in case-
01:24:48.310 --> 01:24:49.600
>> There it is, a meeting request.
01:24:49.600 --> 01:24:51.280
>> Then I'll drag him [inaudible].
01:24:51.280 --> 01:24:53.245
Okay. All right. Thanks, everybody.
01:24:53.245 --> 01:24:54.895
We will see you next week.
01:24:54.895 --> 01:24:56.610
>> I'm dramatically zooming out.
01:24:56.610 --> 01:24:59.160
>> Dramatic zoom out and hit
the "Stop stream" button. Bye.