์ค๋ ๋ง๋ ์ฌ์ํ ๋ฌธ์ ์ ๋๋ค. ์๋ฒ ๋ฉ์๋๊ฐ ์ ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ํ์ฉํ๊ณ ํด๋ผ์ด์ธํธ ํธ์ถ์ด ์ ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ์ธํ๋ ๊ฒฝ์ฐ ํด๋ผ์ด์ธํธ๋ ์๋ฒ ๋ฉ์๋๋ฅผ ํธ์ถํ์ง ๋ชปํฉ๋๋ค (์ค๋ฅ : ๊ฐ์ null ์ผ ์ ์์).
์ฌ๊ธฐ๋ ์ฌ๋:
public void GetAll(long Id, bool DoSomething=false)
๊ณ ๊ฐ:
myHub.GetAll(12);
๋ฉ์๋ ํด๊ฒฐ์ ๋ ์ค๋งํธํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
ํ์คํ ์ข์ ์๊ฐ์ ๋๋ค. ์ค์ ๋ก ์์ ์ ์์ํ์ง๋ง ๋น์์๋ ๊ธฐ๋ณธ ๋์ ํ๋ธ ๊ตฌํ์ ์ต๋ํ ๋นจ๋ฆฌ ํธ์ํ๋๋ก ๋๋ ๋ ธ์ต๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ํ๋ฉด ...
ํ์ฌ ๊ตฌํ์์๋ ๋ฉ์๋ ์ค๋ฒ๋ก๋ ์ง์์ ์ถ๊ฐ ํ ์๋ ์์ต๋๋ค. ๋ช
๋ช
๋ ๋งค๊ฐ ๋ณ์ ํ์ธ๋ ์ถ๊ฐ ํ ์ ์์ง๋ง ์ด๋ ๋งค๊ฐ ๋ณ์๊ฐ ์ค์ ๋ก ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ์ ์ ๋ฌ๋๋ ๋ฐฉ์์ ๋ํ ์ผ๋ถ ์์ ์ ์๋ฏธํฉ๋๋ค (๊ฐ ๋์ ํค-๊ฐ ์ ์ ๋ฌ). ์ด๋ป๊ฒ ์๊ฐํ๋?
Nullable ๋งค๊ฐ ๋ณ์์๋ ์ ์ฉ๋ฉ๋๊น? 3 ๊ฐ์ ๋งค๊ฐ ๋ณ์๊ฐ์๋ ๋ฉ์๋๊ฐ ์๋๋ฐ, ๊ทธ ์ค ๋ง์ง๋ง์ nullable int (int?)์ ๋๋ค. ๋ง์ง๋ง ๋งค๊ฐ ๋ณ์๋ฅผ null๋ก ์ค์ ํ๋ฉด ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
๊ฐ์ null ์ผ ์ ์์ต๋๋ค.
๋งค๊ฐ ๋ณ์ ์ด๋ฆ : o
Newtonsoft.Json.Utilities.ValidationUtils.ArgumentNotNull (Object value, String parameterName)
Newtonsoft.Json.Linq.JToken.FromObjectInternal (Object o, JsonSerializer jsonSerializer)์์
Newtonsoft.Json.Linq.JToken.FromObject (Object o, JsonSerializer jsonSerializer)
Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke T์์
GeoTag.App.Core.Services.SignalRClientService์์
์๋ฒ์์ ๊ธฐ๋ณธ๊ฐ์ ์ค์ ํ์ง ์์์ต๋๋ค.
์ด๊ฒ์ v3 ํ๋ณด๋ก ์ ์ ์ฅ์๋ก ์ฎ๊ธธ ๊ฒ์ ๋๋ค.
@JasonBSteele-์ค๋๋ง์ด๋ผ๋ ๊ฒ์ ์๊ณ ์์ง๋ง ์ธ๊ธํ์ ๋ฌธ์ ๋ ๋ฐฉ๊ธ ์์ ๋์์ต๋๋ค. ๋ค์ ๋ฆด๋ฆฌ์ค์์ ๋ณผ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ์ ์ํ์ ๋ํด ํผ๋ ์ค๋ฝ์ต๋๋ค. SignalR ๋ฆด๋ฆฌ์ค์์ ์์ ๋์์ต๋๊น?
@paulirwin No
...
์์ ์ฌํญ์ 7 ์์ ์ถ์ ๋ 2.2.1์ ์์ต๋๋ค (https://github.com/SignalR/SignalR/releases/tag/2.2.1).
๋๋ ์ด์ ๋ง๋ ๊ฒ์ ๋ค์ ํ
์คํธํ์ผ๋ฉฐ ๋ค์์ ๋ด ๊ฒฐ๊ณผ์
๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ํธ์ถ ํ ํ๋ธ ๋ฉ์๋
public async Task EpicMethod( int? daysTillNETStandard20 ) {}
.NET ํด๋ผ์ด์ธํธ ์๋ฒ ๋ฉ์๋ ํธ์ถ ์๋ :
1. await _serviceRequestHubProxy.Invoke(nameof(ISomethingOnServerSide.EpicMethod), null).ConfigureAwait(false);
System.ArgumentNullException: Value cannot be null.
Parameter name: args
at Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke[TResult,TProgress](String method, Action`1 onProgress, Object[] args)
at Microsoft.AspNet.SignalR.Client.Hubs.HubProxy.Invoke(String method, Object[] args)
2. await _serviceRequestHubProxy.Invoke(nameof(ISomethingOnServerSide.EpicMethod), null, null).ConfigureAwait(false);
System.InvalidOperationException: 'EpicMethod' method could not be resolved. Potential candidates are:
EpicMethod(daysTillNETStandard20:Nullable`1):Task
3. await _serviceRequestHubProxy.Invoke(nameof(ISomethingOnServerSide.EpicMethod), null, new object[] {}).ConfigureAwait(false);
System.InvalidOperationException: 'EpicMethod' method could not be resolved. Potential candidates are:
EpicMethod(daysTillNETStandard20:Nullable`1):Task
4. await _serviceRequestHubProxy.Invoke(nameof(ISomethingOnServerSide.EpicMethod), null, new object[] {null}).ConfigureAwait(false);
System.InvalidOperationException: 'EpicMethod' method could not be resolved. Potential candidates are:
EpicMethod(daysTillNETStandard20:Nullable`1):Task
๊ทธ๋์ ์ง๊ธ์ ํ๋ธ ๋ฉ์๋์์ null ํ์ฉ ์ฌ๋ถ๋ฅผ ์ ๊ฑฐํ๊ณ ํด๋ผ์ด์ธํธ ์ธก์์ 0์ ์ ๋ฌํ์ต๋๋ค.
์ฐพ์ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ค์ ์ฌ๋ ์ค ...
๋๋์ด ๋ฌธ์ ๊ฐ์๋ค. ํด๊ฒฐ ๋ ๊น์?
null
์ Nullable<T>
๋ก ๋ณํํ์ง ์๋ ๋ฐ์ธ๋์ ๊ฐ๋จํ ๋ฌธ์ ์ฒ๋ผ ๋ค๋ฆฝ๋๋ค. ์กฐ์ฌํ๊ฒ ์ต๋๋ค.
๊ทธ๋์ ์ด๊ฒ์ ์ค์ ๋ก ๋์์ธ์ ์ํ ๊ฒ์
๋๋ค. null ๊ฐ์ ์ฌ์ฉํ์ฌ ์ค์ ๋ก ๊ฐ์ฒด ๋ฐฐ์ด์ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ. ๋น์ ์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ ๊ฒ
await _serviceRequestHubProxy.Invoke(nameof(ISomethingOnServerSide.EpicMethod), new object[] {null}).ConfigureAwait(false);
๋น์ ์ดํ๊ณ ์๋ ์ผ์ ๋งค๊ฐ ๋ณ์ ํด์๊ธฐ๊ฐ null ๊ฐ์ params ๋ฐฐ์ด์ ์ ๋ฌํ๋ ๋์ null๋ก ์ฌ์ฉํ๋ params ๋ฐฐ์ด์ ์ค์ ํ๋ ๊ฒ์ ๋๋ค.
ํ์ฌ ๋ฒ์ ์์ ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์ด์ผํฉ๋๊น? ๋ฐํ์ผ์ด 5 ๋ ์ ์ด์์ผ๋ฏ๋ก ์ ํ์ ๋งค๊ฐ ๋ณ์๊ฐ ์ฌ์ ํ ์๋ํ์ง ์์ต๋๊น?
@AlameerAshraf- ์ํํ๋ ค๋ ์์ ์ ์ ํํ๊ฒ ๋ณด์ฌ์ค๋๋ค. ํ์ฌ๋ก์๋์ด ์์ญ์์ ์ด๋ค ๊ฒ๋ ๋ณ๊ฒฝํ ๊ณํ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ ํ์ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ ํ๋๋ก ์๋ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋งค๊ฐ ๋ณ์๊ฐ์๋ ํธ์ถ์ด ์๋๋ฐ ๋งค๊ฐ ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
๋ถํํ๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๊นจ์ง ์๊ณ ์ด ์์ ์ ์ํ ํ ์์๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํ์ฌ ์ธ์์์ด ํธ์ถํ๊ธฐ ๋๋ฌธ์ System.IO.InvalidDataException : Invocation์ 0 ๊ฐ์ ์ธ์๋ฅผ ์ ๊ณตํ์ง๋ง target์ 1 ๊ฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค.
null์ ์ ๋ฌํ๋๋ก ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๊ฒฝํด์ผํ๋ ๊ฒฝ์ฐ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ ์ ์์ผ๋ฉฐ ์ ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์ ์๋ ์์ต๋๋ค .๐ฆ
ํด๊ฒฐ ๋ฐฉ๋ฒ : ๋งค๊ฐ ๋ณ์๊ฐ ์ ๋ฌ๋์ง ์์ ๊ฒฝ์ฐ ์๋ ์ด๋ฆ์ผ๋ก ๋ค์ ์ ๋ฌ๋๋ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ณ ํธ์ถํฉ๋๋ค. ์ค๋ง ๐
์ ํ์ ๋ฉ์๋ ๋งค๊ฐ ๋ณ์์ ์ค๋ฒ๋ก๋ฉ์ด ์ง์๋์ด์ผํ๋ค๊ณ ์๊ฐํฉ๋๋ค. SignalR์ ์ฌ์ฉํ ๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ๊ณผ ๋ฐ ์ง๊ด์ ์ธ ๋ฐฉ๋ฒ์ ๋ชจ๋ ์ฌ์ฉํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ ์ค์ ๋ก ๊ธฐํ์ด ์ง๋ ๊ฒ์ผ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ 2020 ๋ ์ ๋ฉ์๋ ์ค๋ฒ๋ก๋ฉ์ด ์๋ํ์ง๋ง ์ ํ์ ๋งค๊ฐ ๋ณ์๋ ์๋ํ์ง ์์ต๋๋ค. ์ด์จ๋ ๋งค๊ฐ ๋ณ์ํ๋์ง ์์ ๋ฉ์๋๋ฅผ ๋จ์ํ ๋งค๊ฐ ๋ณ์ํ๋์ง ์์ ๋ฉ์๋๋ฅผ ํธ์ถํ๊ณ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ๋ ๊ฒ์ด ์ฌ์ ํ ์ฝ๋ค๊ณ ์๊ฐํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ ํ์ ๋งค๊ฐ ๋ณ์๊ฐ ์๋ ํ๋๋ก ์๋ํ์ง ์๋๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋งค๊ฐ ๋ณ์๊ฐ์๋ ํธ์ถ์ด ์๋๋ฐ ๋งค๊ฐ ๋ณ์๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํฉ๋๋ค.
๋ถํํ๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ๊นจ์ง ์๊ณ ์ด ์์ ์ ์ํ ํ ์์๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ํด๋ผ์ด์ธํธ ์ฝ๋๋ ํ์ฌ ์ธ์์์ด ํธ์ถํ๊ธฐ ๋๋ฌธ์ System.IO.InvalidDataException : Invocation์ 0 ๊ฐ์ ์ธ์๋ฅผ ์ ๊ณตํ์ง๋ง target์ 1 ๊ฐ๋ฅผ ๊ธฐ๋ํฉ๋๋ค.
null์ ์ ๋ฌํ๋๋ก ํด๋ผ์ด์ธํธ๋ฅผ ๋ณ๊ฒฝํด์ผํ๋ ๊ฒฝ์ฐ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ ์งํ ์ ์์ผ๋ฉฐ ์ ํ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ํ ์ฌ์ฉํ์ง ์์ ์๋ ์์ต๋๋ค .๐ฆ
ํด๊ฒฐ ๋ฐฉ๋ฒ : ๋งค๊ฐ ๋ณ์๊ฐ ์ ๋ฌ๋์ง ์์ ๊ฒฝ์ฐ ์๋ ์ด๋ฆ์ผ๋ก ๋ค์ ์ ๋ฌ๋๋ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํ๊ณ ํธ์ถํฉ๋๋ค. ์ค๋ง ๐